diff options
Diffstat (limited to 'drivers/net/niu.c')
| -rw-r--r-- | drivers/net/niu.c | 131 | 
1 files changed, 52 insertions, 79 deletions
diff --git a/drivers/net/niu.c b/drivers/net/niu.c index fe6983af691..781e368329f 100644 --- a/drivers/net/niu.c +++ b/drivers/net/niu.c @@ -283,7 +283,7 @@ static int niu_enable_interrupts(struct niu *np, int on)  static u32 phy_encode(u32 type, int port)  { -	return (type << (port * 2)); +	return type << (port * 2);  }  static u32 phy_decode(u32 val, int port) @@ -3043,8 +3043,7 @@ static int tcam_flush_all(struct niu *np)  static u64 hash_addr_regval(unsigned long index, unsigned long num_entries)  { -	return ((u64)index | (num_entries == 1 ? -			      HASH_TBL_ADDR_AUTOINC : 0)); +	return (u64)index | (num_entries == 1 ? HASH_TBL_ADDR_AUTOINC : 0);  }  #if 0 @@ -3276,7 +3275,7 @@ static u16 tcam_get_index(struct niu *np, u16 idx)  	/* One entry reserved for IP fragment rule */  	if (idx >= (np->clas.tcam_sz - 1))  		idx = 0; -	return (np->clas.tcam_top + ((idx+1) * np->parent->num_ports)); +	return np->clas.tcam_top + ((idx+1) * np->parent->num_ports);  }  static u16 tcam_get_size(struct niu *np) @@ -3313,7 +3312,7 @@ static unsigned int niu_hash_rxaddr(struct rx_ring_info *rp, u64 a)  	a >>= PAGE_SHIFT;  	a ^= (a >> ilog2(MAX_RBR_RING_SIZE)); -	return (a & (MAX_RBR_RING_SIZE - 1)); +	return a & (MAX_RBR_RING_SIZE - 1);  }  static struct page *niu_find_rxpage(struct rx_ring_info *rp, u64 addr, @@ -3484,7 +3483,7 @@ static int niu_process_rx_pkt(struct napi_struct *napi, struct niu *np,  				     RCR_ENTRY_ERROR)))  				skb->ip_summed = CHECKSUM_UNNECESSARY;  			else -				skb->ip_summed = CHECKSUM_NONE; +				skb_checksum_none_assert(skb);  		} else if (!(val & RCR_ENTRY_MULTI))  			append_size = len - skb->len; @@ -4502,9 +4501,10 @@ static int niu_alloc_channels(struct niu *np)  	np->num_rx_rings = parent->rxchan_per_port[port];  	np->num_tx_rings = parent->txchan_per_port[port]; -	np->dev->real_num_tx_queues = np->num_tx_rings; +	netif_set_real_num_rx_queues(np->dev, np->num_rx_rings); +	netif_set_real_num_tx_queues(np->dev, np->num_tx_rings); -	np->rx_rings = kzalloc(np->num_rx_rings * sizeof(struct rx_ring_info), +	np->rx_rings = kcalloc(np->num_rx_rings, sizeof(struct rx_ring_info),  			       GFP_KERNEL);  	err = -ENOMEM;  	if (!np->rx_rings) @@ -4538,7 +4538,7 @@ static int niu_alloc_channels(struct niu *np)  			return err;  	} -	np->tx_rings = kzalloc(np->num_tx_rings * sizeof(struct tx_ring_info), +	np->tx_rings = kcalloc(np->num_tx_rings, sizeof(struct tx_ring_info),  			       GFP_KERNEL);  	err = -ENOMEM;  	if (!np->tx_rings) @@ -7090,24 +7090,20 @@ static int niu_get_hash_opts(struct niu *np, struct ethtool_rxnfc *nfc)  static void niu_get_ip4fs_from_tcam_key(struct niu_tcam_entry *tp,  					struct ethtool_rx_flow_spec *fsp)  { +	u32 tmp; +	u16 prt; -	fsp->h_u.tcp_ip4_spec.ip4src = (tp->key[3] & TCAM_V4KEY3_SADDR) >> -		TCAM_V4KEY3_SADDR_SHIFT; -	fsp->h_u.tcp_ip4_spec.ip4dst = (tp->key[3] & TCAM_V4KEY3_DADDR) >> -		TCAM_V4KEY3_DADDR_SHIFT; -	fsp->m_u.tcp_ip4_spec.ip4src = (tp->key_mask[3] & TCAM_V4KEY3_SADDR) >> -		TCAM_V4KEY3_SADDR_SHIFT; -	fsp->m_u.tcp_ip4_spec.ip4dst = (tp->key_mask[3] & TCAM_V4KEY3_DADDR) >> -		TCAM_V4KEY3_DADDR_SHIFT; +	tmp = (tp->key[3] & TCAM_V4KEY3_SADDR) >> TCAM_V4KEY3_SADDR_SHIFT; +	fsp->h_u.tcp_ip4_spec.ip4src = cpu_to_be32(tmp); -	fsp->h_u.tcp_ip4_spec.ip4src = -		cpu_to_be32(fsp->h_u.tcp_ip4_spec.ip4src); -	fsp->m_u.tcp_ip4_spec.ip4src = -		cpu_to_be32(fsp->m_u.tcp_ip4_spec.ip4src); -	fsp->h_u.tcp_ip4_spec.ip4dst = -		cpu_to_be32(fsp->h_u.tcp_ip4_spec.ip4dst); -	fsp->m_u.tcp_ip4_spec.ip4dst = -		cpu_to_be32(fsp->m_u.tcp_ip4_spec.ip4dst); +	tmp = (tp->key[3] & TCAM_V4KEY3_DADDR) >> TCAM_V4KEY3_DADDR_SHIFT; +	fsp->h_u.tcp_ip4_spec.ip4dst = cpu_to_be32(tmp); + +	tmp = (tp->key_mask[3] & TCAM_V4KEY3_SADDR) >> TCAM_V4KEY3_SADDR_SHIFT; +	fsp->m_u.tcp_ip4_spec.ip4src = cpu_to_be32(tmp); + +	tmp = (tp->key_mask[3] & TCAM_V4KEY3_DADDR) >> TCAM_V4KEY3_DADDR_SHIFT; +	fsp->m_u.tcp_ip4_spec.ip4dst = cpu_to_be32(tmp);  	fsp->h_u.tcp_ip4_spec.tos = (tp->key[2] & TCAM_V4KEY2_TOS) >>  		TCAM_V4KEY2_TOS_SHIFT; @@ -7118,54 +7114,40 @@ static void niu_get_ip4fs_from_tcam_key(struct niu_tcam_entry *tp,  	case TCP_V4_FLOW:  	case UDP_V4_FLOW:  	case SCTP_V4_FLOW: -		fsp->h_u.tcp_ip4_spec.psrc = -			((tp->key[2] & TCAM_V4KEY2_PORT_SPI) >> -			 TCAM_V4KEY2_PORT_SPI_SHIFT) >> 16; -		fsp->h_u.tcp_ip4_spec.pdst = -			((tp->key[2] & TCAM_V4KEY2_PORT_SPI) >> -			 TCAM_V4KEY2_PORT_SPI_SHIFT) & 0xffff; -		fsp->m_u.tcp_ip4_spec.psrc = -			((tp->key_mask[2] & TCAM_V4KEY2_PORT_SPI) >> -			 TCAM_V4KEY2_PORT_SPI_SHIFT) >> 16; -		fsp->m_u.tcp_ip4_spec.pdst = -			((tp->key_mask[2] & TCAM_V4KEY2_PORT_SPI) >> -			 TCAM_V4KEY2_PORT_SPI_SHIFT) & 0xffff; +		prt = ((tp->key[2] & TCAM_V4KEY2_PORT_SPI) >> +			TCAM_V4KEY2_PORT_SPI_SHIFT) >> 16; +		fsp->h_u.tcp_ip4_spec.psrc = cpu_to_be16(prt); + +		prt = ((tp->key[2] & TCAM_V4KEY2_PORT_SPI) >> +			TCAM_V4KEY2_PORT_SPI_SHIFT) & 0xffff; +		fsp->h_u.tcp_ip4_spec.pdst = cpu_to_be16(prt); -		fsp->h_u.tcp_ip4_spec.psrc = -			cpu_to_be16(fsp->h_u.tcp_ip4_spec.psrc); -		fsp->h_u.tcp_ip4_spec.pdst = -			cpu_to_be16(fsp->h_u.tcp_ip4_spec.pdst); -		fsp->m_u.tcp_ip4_spec.psrc = -			cpu_to_be16(fsp->m_u.tcp_ip4_spec.psrc); -		fsp->m_u.tcp_ip4_spec.pdst = -			cpu_to_be16(fsp->m_u.tcp_ip4_spec.pdst); +		prt = ((tp->key_mask[2] & TCAM_V4KEY2_PORT_SPI) >> +			TCAM_V4KEY2_PORT_SPI_SHIFT) >> 16; +		fsp->m_u.tcp_ip4_spec.psrc = cpu_to_be16(prt); + +		prt = ((tp->key_mask[2] & TCAM_V4KEY2_PORT_SPI) >> +			 TCAM_V4KEY2_PORT_SPI_SHIFT) & 0xffff; +		fsp->m_u.tcp_ip4_spec.pdst = cpu_to_be16(prt);  		break;  	case AH_V4_FLOW:  	case ESP_V4_FLOW: -		fsp->h_u.ah_ip4_spec.spi = -			(tp->key[2] & TCAM_V4KEY2_PORT_SPI) >> -			TCAM_V4KEY2_PORT_SPI_SHIFT; -		fsp->m_u.ah_ip4_spec.spi = -			(tp->key_mask[2] & TCAM_V4KEY2_PORT_SPI) >> +		tmp = (tp->key[2] & TCAM_V4KEY2_PORT_SPI) >>  			TCAM_V4KEY2_PORT_SPI_SHIFT; +		fsp->h_u.ah_ip4_spec.spi = cpu_to_be32(tmp); -		fsp->h_u.ah_ip4_spec.spi = -			cpu_to_be32(fsp->h_u.ah_ip4_spec.spi); -		fsp->m_u.ah_ip4_spec.spi = -			cpu_to_be32(fsp->m_u.ah_ip4_spec.spi); +		tmp = (tp->key_mask[2] & TCAM_V4KEY2_PORT_SPI) >> +			TCAM_V4KEY2_PORT_SPI_SHIFT; +		fsp->m_u.ah_ip4_spec.spi = cpu_to_be32(tmp);  		break;  	case IP_USER_FLOW: -		fsp->h_u.usr_ip4_spec.l4_4_bytes = -			(tp->key[2] & TCAM_V4KEY2_PORT_SPI) >> -			TCAM_V4KEY2_PORT_SPI_SHIFT; -		fsp->m_u.usr_ip4_spec.l4_4_bytes = -			(tp->key_mask[2] & TCAM_V4KEY2_PORT_SPI) >> +		tmp = (tp->key[2] & TCAM_V4KEY2_PORT_SPI) >>  			TCAM_V4KEY2_PORT_SPI_SHIFT; +		fsp->h_u.usr_ip4_spec.l4_4_bytes = cpu_to_be32(tmp); -		fsp->h_u.usr_ip4_spec.l4_4_bytes = -			cpu_to_be32(fsp->h_u.usr_ip4_spec.l4_4_bytes); -		fsp->m_u.usr_ip4_spec.l4_4_bytes = -			cpu_to_be32(fsp->m_u.usr_ip4_spec.l4_4_bytes); +		tmp = (tp->key_mask[2] & TCAM_V4KEY2_PORT_SPI) >> +			TCAM_V4KEY2_PORT_SPI_SHIFT; +		fsp->m_u.usr_ip4_spec.l4_4_bytes = cpu_to_be32(tmp);  		fsp->h_u.usr_ip4_spec.proto =  			(tp->key[2] & TCAM_V4KEY2_PROTO) >> @@ -7462,10 +7444,12 @@ static int niu_add_ethtool_tcam_entry(struct niu *np,  	if (fsp->flow_type == IP_USER_FLOW) {  		int i;  		int add_usr_cls = 0; -		int ipv6 = 0;  		struct ethtool_usrip4_spec *uspec = &fsp->h_u.usr_ip4_spec;  		struct ethtool_usrip4_spec *umask = &fsp->m_u.usr_ip4_spec; +		if (uspec->ip_ver != ETH_RX_NFC_IP4) +			return -EINVAL; +  		niu_lock_parent(np, flags);  		for (i = 0; i < NIU_L3_PROG_CLS; i++) { @@ -7494,9 +7478,7 @@ static int niu_add_ethtool_tcam_entry(struct niu *np,  				default:  					break;  				} -				if (uspec->ip_ver == ETH_RX_NFC_IP6) -					ipv6 = 1; -				ret = tcam_user_ip_class_set(np, class, ipv6, +				ret = tcam_user_ip_class_set(np, class, 0,  							     uspec->proto,  							     uspec->tos,  							     umask->tos); @@ -7553,16 +7535,7 @@ static int niu_add_ethtool_tcam_entry(struct niu *np,  		ret = -EINVAL;  		goto out;  	case IP_USER_FLOW: -		if (fsp->h_u.usr_ip4_spec.ip_ver == ETH_RX_NFC_IP4) { -			niu_get_tcamkey_from_ip4fs(fsp, tp, l2_rdc_table, -						   class); -		} else { -			/* Not yet implemented */ -			netdev_info(np->dev, "niu%d: In %s(): usr flow for IPv6 not implemented\n", -				    parent->index, __func__); -			ret = -EINVAL; -			goto out; -		} +		niu_get_tcamkey_from_ip4fs(fsp, tp, l2_rdc_table, class);  		break;  	default:  		netdev_info(np->dev, "niu%d: In %s(): Unknown flow type %d\n", @@ -7805,11 +7778,11 @@ static int niu_get_sset_count(struct net_device *dev, int stringset)  	if (stringset != ETH_SS_STATS)  		return -EINVAL; -	return ((np->flags & NIU_FLAGS_XMAC ? +	return (np->flags & NIU_FLAGS_XMAC ?  		 NUM_XMAC_STAT_KEYS :  		 NUM_BMAC_STAT_KEYS) +  		(np->num_rx_rings * NUM_RXCHAN_STAT_KEYS) + -		(np->num_tx_rings * NUM_TXCHAN_STAT_KEYS)); +		(np->num_tx_rings * NUM_TXCHAN_STAT_KEYS);  }  static void niu_get_ethtool_stats(struct net_device *dev,  |