diff options
Diffstat (limited to 'drivers/s390/net')
| -rw-r--r-- | drivers/s390/net/ctcm_mpc.h | 1 | ||||
| -rw-r--r-- | drivers/s390/net/fsm.h | 2 | ||||
| -rw-r--r-- | drivers/s390/net/qeth_core.h | 4 | ||||
| -rw-r--r-- | drivers/s390/net/qeth_core_main.c | 58 | ||||
| -rw-r--r-- | drivers/s390/net/qeth_l3_main.c | 125 | 
5 files changed, 98 insertions, 92 deletions
| diff --git a/drivers/s390/net/ctcm_mpc.h b/drivers/s390/net/ctcm_mpc.h index 5336120cddf1..1fa07b0c11c0 100644 --- a/drivers/s390/net/ctcm_mpc.h +++ b/drivers/s390/net/ctcm_mpc.h @@ -12,6 +12,7 @@  #ifndef _CTC_MPC_H_  #define _CTC_MPC_H_ +#include <linux/interrupt.h>  #include <linux/skbuff.h>  #include "fsm.h" diff --git a/drivers/s390/net/fsm.h b/drivers/s390/net/fsm.h index 1e8b235d95b5..a4510cf59034 100644 --- a/drivers/s390/net/fsm.h +++ b/drivers/s390/net/fsm.h @@ -8,7 +8,7 @@  #include <linux/slab.h>  #include <linux/sched.h>  #include <linux/string.h> -#include <asm/atomic.h> +#include <linux/atomic.h>  /**   * Define this to get debugging messages. diff --git a/drivers/s390/net/qeth_core.h b/drivers/s390/net/qeth_core.h index 55c6aa1c9704..26a4110eeb2d 100644 --- a/drivers/s390/net/qeth_core.h +++ b/drivers/s390/net/qeth_core.h @@ -361,7 +361,7 @@ enum qeth_header_ids {  static inline int qeth_is_last_sbale(struct qdio_buffer_element *sbale)  { -	return (sbale->flags & SBAL_FLAGS_LAST_ENTRY); +	return (sbale->eflags & SBAL_EFLAGS_LAST_ENTRY);  }  enum qeth_qdio_buffer_states { @@ -720,7 +720,7 @@ struct qeth_card {  	wait_queue_head_t wait_q;  	spinlock_t vlanlock;  	spinlock_t mclock; -	struct vlan_group *vlangrp; +	unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];  	struct list_head vid_list;  	struct list_head mc_list;  	struct work_struct kernel_thread_starter; diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c index 503678a30981..4550573c25e5 100644 --- a/drivers/s390/net/qeth_core_main.c +++ b/drivers/s390/net/qeth_core_main.c @@ -890,7 +890,7 @@ static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue,  	struct sk_buff *skb;  	/* is PCI flag set on buffer? */ -	if (buf->buffer->element[0].flags & 0x40) +	if (buf->buffer->element[0].sflags & SBAL_SFLAGS0_PCI_REQ)  		atomic_dec(&queue->set_pci_flags_count);  	skb = skb_dequeue(&buf->skb_list); @@ -906,9 +906,11 @@ static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue,  		buf->is_header[i] = 0;  		buf->buffer->element[i].length = 0;  		buf->buffer->element[i].addr = NULL; -		buf->buffer->element[i].flags = 0; +		buf->buffer->element[i].eflags = 0; +		buf->buffer->element[i].sflags = 0;  	} -	buf->buffer->element[15].flags = 0; +	buf->buffer->element[15].eflags = 0; +	buf->buffer->element[15].sflags = 0;  	buf->next_element_to_fill = 0;  	atomic_set(&buf->state, QETH_QDIO_BUF_EMPTY);  } @@ -1095,7 +1097,6 @@ static int qeth_setup_card(struct qeth_card *card)  	card->dev = NULL;  	spin_lock_init(&card->vlanlock);  	spin_lock_init(&card->mclock); -	card->vlangrp = NULL;  	spin_lock_init(&card->lock);  	spin_lock_init(&card->ip_lock);  	spin_lock_init(&card->thread_mask_lock); @@ -2368,9 +2369,10 @@ static int qeth_init_input_buffer(struct qeth_card *card,  		buf->buffer->element[i].length = PAGE_SIZE;  		buf->buffer->element[i].addr =  pool_entry->elements[i];  		if (i == QETH_MAX_BUFFER_ELEMENTS(card) - 1) -			buf->buffer->element[i].flags = SBAL_FLAGS_LAST_ENTRY; +			buf->buffer->element[i].eflags = SBAL_EFLAGS_LAST_ENTRY;  		else -			buf->buffer->element[i].flags = 0; +			buf->buffer->element[i].eflags = 0; +		buf->buffer->element[i].sflags = 0;  	}  	return 0;  } @@ -2718,11 +2720,11 @@ int qeth_check_qdio_errors(struct qeth_card *card, struct qdio_buffer *buf,  	if (qdio_error) {  		QETH_CARD_TEXT(card, 2, dbftext);  		QETH_CARD_TEXT_(card, 2, " F15=%02X", -			       buf->element[15].flags & 0xff); +			       buf->element[15].sflags);  		QETH_CARD_TEXT_(card, 2, " F14=%02X", -			       buf->element[14].flags & 0xff); +			       buf->element[14].sflags);  		QETH_CARD_TEXT_(card, 2, " qerr=%X", qdio_error); -		if ((buf->element[15].flags & 0xff) == 0x12) { +		if ((buf->element[15].sflags) == 0x12) {  			card->stats.rx_dropped++;  			return 0;  		} else @@ -2798,7 +2800,7 @@ EXPORT_SYMBOL_GPL(qeth_queue_input_buffer);  static int qeth_handle_send_error(struct qeth_card *card,  		struct qeth_qdio_out_buffer *buffer, unsigned int qdio_err)  { -	int sbalf15 = buffer->buffer->element[15].flags & 0xff; +	int sbalf15 = buffer->buffer->element[15].sflags;  	QETH_CARD_TEXT(card, 6, "hdsnderr");  	if (card->info.type == QETH_CARD_TYPE_IQD) { @@ -2907,8 +2909,8 @@ static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index,  	for (i = index; i < index + count; ++i) {  		buf = &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q]; -		buf->buffer->element[buf->next_element_to_fill - 1].flags |= -				SBAL_FLAGS_LAST_ENTRY; +		buf->buffer->element[buf->next_element_to_fill - 1].eflags |= +				SBAL_EFLAGS_LAST_ENTRY;  		if (queue->card->info.type == QETH_CARD_TYPE_IQD)  			continue; @@ -2921,7 +2923,7 @@ static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index,  				/* it's likely that we'll go to packing  				 * mode soon */  				atomic_inc(&queue->set_pci_flags_count); -				buf->buffer->element[0].flags |= 0x40; +				buf->buffer->element[0].sflags |= SBAL_SFLAGS0_PCI_REQ;  			}  		} else {  			if (!atomic_read(&queue->set_pci_flags_count)) { @@ -2934,7 +2936,7 @@ static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index,  				 * further send was requested by the stack  				 */  				atomic_inc(&queue->set_pci_flags_count); -				buf->buffer->element[0].flags |= 0x40; +				buf->buffer->element[0].sflags |= SBAL_SFLAGS0_PCI_REQ;  			}  		}  	} @@ -3180,20 +3182,20 @@ static inline void __qeth_fill_buffer(struct sk_buff *skb,  		if (!length) {  			if (first_lap)  				if (skb_shinfo(skb)->nr_frags) -					buffer->element[element].flags = -						SBAL_FLAGS_FIRST_FRAG; +					buffer->element[element].eflags = +						SBAL_EFLAGS_FIRST_FRAG;  				else -					buffer->element[element].flags = 0; +					buffer->element[element].eflags = 0;  			else -				buffer->element[element].flags = -				    SBAL_FLAGS_MIDDLE_FRAG; +				buffer->element[element].eflags = +				    SBAL_EFLAGS_MIDDLE_FRAG;  		} else {  			if (first_lap) -				buffer->element[element].flags = -				    SBAL_FLAGS_FIRST_FRAG; +				buffer->element[element].eflags = +				    SBAL_EFLAGS_FIRST_FRAG;  			else -				buffer->element[element].flags = -				    SBAL_FLAGS_MIDDLE_FRAG; +				buffer->element[element].eflags = +				    SBAL_EFLAGS_MIDDLE_FRAG;  		}  		data += length_here;  		element++; @@ -3205,12 +3207,12 @@ static inline void __qeth_fill_buffer(struct sk_buff *skb,  		buffer->element[element].addr = (char *)page_to_phys(frag->page)  			+ frag->page_offset;  		buffer->element[element].length = frag->size; -		buffer->element[element].flags = SBAL_FLAGS_MIDDLE_FRAG; +		buffer->element[element].eflags = SBAL_EFLAGS_MIDDLE_FRAG;  		element++;  	} -	if (buffer->element[element - 1].flags) -		buffer->element[element - 1].flags = SBAL_FLAGS_LAST_FRAG; +	if (buffer->element[element - 1].eflags) +		buffer->element[element - 1].eflags = SBAL_EFLAGS_LAST_FRAG;  	*next_element_to_fill = element;  } @@ -3234,7 +3236,7 @@ static inline int qeth_fill_buffer(struct qeth_qdio_out_q *queue,  		/*fill first buffer entry only with header information */  		buffer->element[element].addr = skb->data;  		buffer->element[element].length = hdr_len; -		buffer->element[element].flags = SBAL_FLAGS_FIRST_FRAG; +		buffer->element[element].eflags = SBAL_EFLAGS_FIRST_FRAG;  		buf->next_element_to_fill++;  		skb->data += hdr_len;  		skb->len  -= hdr_len; @@ -3246,7 +3248,7 @@ static inline int qeth_fill_buffer(struct qeth_qdio_out_q *queue,  		buffer->element[element].addr = hdr;  		buffer->element[element].length = sizeof(struct qeth_hdr) +  							hd_len; -		buffer->element[element].flags = SBAL_FLAGS_FIRST_FRAG; +		buffer->element[element].eflags = SBAL_EFLAGS_FIRST_FRAG;  		buf->is_header[element] = 1;  		buf->next_element_to_fill++;  	} diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c index fd69da3fa6b4..fafb8c299540 100644 --- a/drivers/s390/net/qeth_l3_main.c +++ b/drivers/s390/net/qeth_l3_main.c @@ -13,6 +13,7 @@  #include <linux/module.h>  #include <linux/moduleparam.h> +#include <linux/bitops.h>  #include <linux/string.h>  #include <linux/errno.h>  #include <linux/kernel.h> @@ -23,6 +24,7 @@  #include <linux/inetdevice.h>  #include <linux/igmp.h>  #include <linux/slab.h> +#include <linux/if_vlan.h>  #include <net/ip.h>  #include <net/arp.h> @@ -1696,16 +1698,18 @@ static void qeth_l3_add_mc(struct qeth_card *card, struct in_device *in4_dev)  static void qeth_l3_add_vlan_mc(struct qeth_card *card)  {  	struct in_device *in_dev; -	struct vlan_group *vg; -	int i; +	u16 vid;  	QETH_CARD_TEXT(card, 4, "addmcvl"); -	if (!qeth_is_supported(card, IPA_FULL_VLAN) || (card->vlangrp == NULL)) +	if (!qeth_is_supported(card, IPA_FULL_VLAN))  		return; -	vg = card->vlangrp; -	for (i = 0; i < VLAN_N_VID; i++) { -		struct net_device *netdev = vlan_group_get_device(vg, i); +	for_each_set_bit(vid, card->active_vlans, VLAN_N_VID) { +		struct net_device *netdev; + +		rcu_read_lock(); +		netdev = __vlan_find_dev_deep(card->dev, vid); +		rcu_read_unlock();  		if (netdev == NULL ||  		    !(netdev->flags & IFF_UP))  			continue; @@ -1759,16 +1763,16 @@ static void qeth_l3_add_mc6(struct qeth_card *card, struct inet6_dev *in6_dev)  static void qeth_l3_add_vlan_mc6(struct qeth_card *card)  {  	struct inet6_dev *in_dev; -	struct vlan_group *vg; -	int i; +	u16 vid;  	QETH_CARD_TEXT(card, 4, "admc6vl"); -	if (!qeth_is_supported(card, IPA_FULL_VLAN) || (card->vlangrp == NULL)) +	if (!qeth_is_supported(card, IPA_FULL_VLAN))  		return; -	vg = card->vlangrp; -	for (i = 0; i < VLAN_N_VID; i++) { -		struct net_device *netdev = vlan_group_get_device(vg, i); +	for_each_set_bit(vid, card->active_vlans, VLAN_N_VID) { +		struct net_device *netdev; + +		netdev = __vlan_find_dev_deep(card->dev, vid);  		if (netdev == NULL ||  		    !(netdev->flags & IFF_UP))  			continue; @@ -1806,10 +1810,12 @@ static void qeth_l3_free_vlan_addresses4(struct qeth_card *card,  	struct in_device *in_dev;  	struct in_ifaddr *ifa;  	struct qeth_ipaddr *addr; +	struct net_device *netdev;  	QETH_CARD_TEXT(card, 4, "frvaddr4"); -	in_dev = in_dev_get(vlan_group_get_device(card->vlangrp, vid)); +	netdev = __vlan_find_dev_deep(card->dev, vid); +	in_dev = in_dev_get(netdev);  	if (!in_dev)  		return;  	for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) { @@ -1832,10 +1838,12 @@ static void qeth_l3_free_vlan_addresses6(struct qeth_card *card,  	struct inet6_dev *in6_dev;  	struct inet6_ifaddr *ifa;  	struct qeth_ipaddr *addr; +	struct net_device *netdev;  	QETH_CARD_TEXT(card, 4, "frvaddr6"); -	in6_dev = in6_dev_get(vlan_group_get_device(card->vlangrp, vid)); +	netdev = __vlan_find_dev_deep(card->dev, vid); +	in6_dev = in6_dev_get(netdev);  	if (!in6_dev)  		return;  	list_for_each_entry(ifa, &in6_dev->addr_list, if_list) { @@ -1856,26 +1864,15 @@ static void qeth_l3_free_vlan_addresses6(struct qeth_card *card,  static void qeth_l3_free_vlan_addresses(struct qeth_card *card,  			unsigned short vid)  { -	if (!card->vlangrp) -		return;  	qeth_l3_free_vlan_addresses4(card, vid);  	qeth_l3_free_vlan_addresses6(card, vid);  } -static void qeth_l3_vlan_rx_register(struct net_device *dev, -			struct vlan_group *grp) +static void qeth_l3_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)  {  	struct qeth_card *card = dev->ml_priv; -	unsigned long flags; - -	QETH_CARD_TEXT(card, 4, "vlanreg"); -	spin_lock_irqsave(&card->vlanlock, flags); -	card->vlangrp = grp; -	spin_unlock_irqrestore(&card->vlanlock, flags); -} -static void qeth_l3_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) -{ +	set_bit(vid, card->active_vlans);  	return;  } @@ -1892,7 +1889,7 @@ static void qeth_l3_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)  	spin_lock_irqsave(&card->vlanlock, flags);  	/* unregister IP addresses of vlan device */  	qeth_l3_free_vlan_addresses(card, vid); -	vlan_group_set_device(card->vlangrp, vid, NULL); +	clear_bit(vid, card->active_vlans);  	spin_unlock_irqrestore(&card->vlanlock, flags);  	qeth_l3_set_multicast_list(card->dev);  } @@ -2014,10 +2011,8 @@ static int qeth_l3_process_inbound_buffer(struct qeth_card *card,  						      &vlan_tag);  			len = skb->len;  			if (is_vlan && !card->options.sniffer) -				vlan_gro_receive(&card->napi, card->vlangrp, -					vlan_tag, skb); -			else -				napi_gro_receive(&card->napi, skb); +				__vlan_hwaccel_put_tag(skb, vlan_tag); +			napi_gro_receive(&card->napi, skb);  			break;  		case QETH_HEADER_TYPE_LAYER2: /* for HiperSockets sniffer */  			skb->pkt_type = PACKET_HOST; @@ -2118,15 +2113,15 @@ static int qeth_l3_verify_vlan_dev(struct net_device *dev,  			struct qeth_card *card)  {  	int rc = 0; -	struct vlan_group *vg; -	int i; +	u16 vid; -	vg = card->vlangrp; -	if (!vg) -		return rc; +	for_each_set_bit(vid, card->active_vlans, VLAN_N_VID) { +		struct net_device *netdev; -	for (i = 0; i < VLAN_N_VID; i++) { -		if (vlan_group_get_device(vg, i) == dev) { +		rcu_read_lock(); +		netdev = __vlan_find_dev_deep(dev, vid); +		rcu_read_unlock(); +		if (netdev == dev) {  			rc = QETH_VLAN_CARD;  			break;  		} @@ -2742,9 +2737,14 @@ static int qeth_l3_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)  int inline qeth_l3_get_cast_type(struct qeth_card *card, struct sk_buff *skb)  {  	int cast_type = RTN_UNSPEC; - -	if (skb_dst(skb) && skb_dst(skb)->neighbour) { -		cast_type = skb_dst(skb)->neighbour->type; +	struct neighbour *n = NULL; +	struct dst_entry *dst; + +	dst = skb_dst(skb); +	if (dst) +		n = dst_get_neighbour(dst); +	if (n) { +		cast_type = n->type;  		if ((cast_type == RTN_BROADCAST) ||  		    (cast_type == RTN_MULTICAST) ||  		    (cast_type == RTN_ANYCAST)) @@ -2787,6 +2787,9 @@ int inline qeth_l3_get_cast_type(struct qeth_card *card, struct sk_buff *skb)  static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,  		struct sk_buff *skb, int ipv, int cast_type)  { +	struct neighbour *n = NULL; +	struct dst_entry *dst; +  	memset(hdr, 0, sizeof(struct qeth_hdr));  	hdr->hdr.l3.id = QETH_HEADER_TYPE_LAYER3;  	hdr->hdr.l3.ext_flags = 0; @@ -2795,7 +2798,7 @@ static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,  	 * before we're going to overwrite this location with next hop ip.  	 * v6 uses passthrough, v4 sets the tag in the QDIO header.  	 */ -	if (card->vlangrp && vlan_tx_tag_present(skb)) { +	if (vlan_tx_tag_present(skb)) {  		if ((ipv == 4) || (card->info.type == QETH_CARD_TYPE_IQD))  			hdr->hdr.l3.ext_flags = QETH_HDR_EXT_VLAN_FRAME;  		else @@ -2804,13 +2807,16 @@ static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,  	}  	hdr->hdr.l3.length = skb->len - sizeof(struct qeth_hdr); +	dst = skb_dst(skb); +	if (dst) +		n = dst_get_neighbour(dst);  	if (ipv == 4) {  		/* IPv4 */  		hdr->hdr.l3.flags = qeth_l3_get_qeth_hdr_flags4(cast_type);  		memset(hdr->hdr.l3.dest_addr, 0, 12); -		if ((skb_dst(skb)) && (skb_dst(skb)->neighbour)) { +		if (n) {  			*((u32 *) (&hdr->hdr.l3.dest_addr[12])) = -			    *((u32 *) skb_dst(skb)->neighbour->primary_key); +			    *((u32 *) n->primary_key);  		} else {  			/* fill in destination address used in ip header */  			*((u32 *) (&hdr->hdr.l3.dest_addr[12])) = @@ -2821,9 +2827,9 @@ static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,  		hdr->hdr.l3.flags = qeth_l3_get_qeth_hdr_flags6(cast_type);  		if (card->info.type == QETH_CARD_TYPE_IQD)  			hdr->hdr.l3.flags &= ~QETH_HDR_PASSTHRU; -		if ((skb_dst(skb)) && (skb_dst(skb)->neighbour)) { +		if (n) {  			memcpy(hdr->hdr.l3.dest_addr, -			       skb_dst(skb)->neighbour->primary_key, 16); +			       n->primary_key, 16);  		} else {  			/* fill in destination address used in ip header */  			memcpy(hdr->hdr.l3.dest_addr, @@ -2977,8 +2983,7 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)  				skb_pull(new_skb, ETH_HLEN);  		} -		if (ipv != 4 && card->vlangrp && -				vlan_tx_tag_present(new_skb)) { +		if (ipv != 4 && vlan_tx_tag_present(new_skb)) {  			skb_push(new_skb, VLAN_HLEN);  			skb_copy_to_linear_data(new_skb, new_skb->data + 4, 4);  			skb_copy_to_linear_data_offset(new_skb, 4, @@ -3222,14 +3227,13 @@ static const struct net_device_ops qeth_l3_netdev_ops = {  	.ndo_start_xmit		= qeth_l3_hard_start_xmit,  	.ndo_validate_addr	= eth_validate_addr,  	.ndo_set_multicast_list = qeth_l3_set_multicast_list, -	.ndo_do_ioctl	   	= qeth_l3_do_ioctl, -	.ndo_change_mtu	   	= qeth_change_mtu, -	.ndo_fix_features   	= qeth_l3_fix_features, -	.ndo_set_features   	= qeth_l3_set_features, -	.ndo_vlan_rx_register	= qeth_l3_vlan_rx_register, +	.ndo_do_ioctl		= qeth_l3_do_ioctl, +	.ndo_change_mtu		= qeth_change_mtu, +	.ndo_fix_features	= qeth_l3_fix_features, +	.ndo_set_features	= qeth_l3_set_features,  	.ndo_vlan_rx_add_vid	= qeth_l3_vlan_rx_add_vid,  	.ndo_vlan_rx_kill_vid   = qeth_l3_vlan_rx_kill_vid, -	.ndo_tx_timeout	   	= qeth_tx_timeout, +	.ndo_tx_timeout		= qeth_tx_timeout,  };  static const struct net_device_ops qeth_l3_osa_netdev_ops = { @@ -3239,14 +3243,13 @@ static const struct net_device_ops qeth_l3_osa_netdev_ops = {  	.ndo_start_xmit		= qeth_l3_hard_start_xmit,  	.ndo_validate_addr	= eth_validate_addr,  	.ndo_set_multicast_list = qeth_l3_set_multicast_list, -	.ndo_do_ioctl	   	= qeth_l3_do_ioctl, -	.ndo_change_mtu	   	= qeth_change_mtu, -	.ndo_fix_features   	= qeth_l3_fix_features, -	.ndo_set_features   	= qeth_l3_set_features, -	.ndo_vlan_rx_register	= qeth_l3_vlan_rx_register, +	.ndo_do_ioctl		= qeth_l3_do_ioctl, +	.ndo_change_mtu		= qeth_change_mtu, +	.ndo_fix_features	= qeth_l3_fix_features, +	.ndo_set_features	= qeth_l3_set_features,  	.ndo_vlan_rx_add_vid	= qeth_l3_vlan_rx_add_vid,  	.ndo_vlan_rx_kill_vid   = qeth_l3_vlan_rx_kill_vid, -	.ndo_tx_timeout	   	= qeth_tx_timeout, +	.ndo_tx_timeout		= qeth_tx_timeout,  	.ndo_neigh_setup	= qeth_l3_neigh_setup,  }; | 
