diff options
| -rw-r--r-- | drivers/net/s2io-regs.h | 1 | ||||
| -rw-r--r-- | drivers/net/s2io.c | 38 | ||||
| -rw-r--r-- | drivers/net/s2io.h | 3 |
3 files changed, 40 insertions, 2 deletions
diff --git a/drivers/net/s2io-regs.h b/drivers/net/s2io-regs.h index 0e345cbc2bf9..33fb7f3b7041 100644 --- a/drivers/net/s2io-regs.h +++ b/drivers/net/s2io-regs.h | |||
| @@ -430,6 +430,7 @@ struct XENA_dev_config { | |||
| 430 | #define TX_PA_CFG_IGNORE_SNAP_OUI BIT(2) | 430 | #define TX_PA_CFG_IGNORE_SNAP_OUI BIT(2) |
| 431 | #define TX_PA_CFG_IGNORE_LLC_CTRL BIT(3) | 431 | #define TX_PA_CFG_IGNORE_LLC_CTRL BIT(3) |
| 432 | #define TX_PA_CFG_IGNORE_L2_ERR BIT(6) | 432 | #define TX_PA_CFG_IGNORE_L2_ERR BIT(6) |
| 433 | #define RX_PA_CFG_STRIP_VLAN_TAG BIT(15) | ||
| 433 | 434 | ||
| 434 | /* Recent add, used only debug purposes. */ | 435 | /* Recent add, used only debug purposes. */ |
| 435 | u64 pcc_enable; | 436 | u64 pcc_enable; |
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c index cdf36745bb7b..89881aa2fc31 100644 --- a/drivers/net/s2io.c +++ b/drivers/net/s2io.c | |||
| @@ -42,6 +42,14 @@ | |||
| 42 | * Possible values '1' for enable '0' for disable. Default is '0' | 42 | * Possible values '1' for enable '0' for disable. Default is '0' |
| 43 | * lro_max_pkts: This parameter defines maximum number of packets can be | 43 | * lro_max_pkts: This parameter defines maximum number of packets can be |
| 44 | * aggregated as a single large packet | 44 | * aggregated as a single large packet |
| 45 | * napi: This parameter used to enable/disable NAPI (polling Rx) | ||
| 46 | * Possible values '1' for enable and '0' for disable. Default is '1' | ||
| 47 | * ufo: This parameter used to enable/disable UDP Fragmentation Offload(UFO) | ||
| 48 | * Possible values '1' for enable and '0' for disable. Default is '0' | ||
| 49 | * vlan_tag_strip: This can be used to enable or disable vlan stripping. | ||
| 50 | * Possible values '1' for enable , '0' for disable. | ||
| 51 | * Default is '2' - which means disable in promisc mode | ||
| 52 | * and enable in non-promiscuous mode. | ||
| 45 | ************************************************************************/ | 53 | ************************************************************************/ |
| 46 | 54 | ||
| 47 | #include <linux/module.h> | 55 | #include <linux/module.h> |
| @@ -293,6 +301,9 @@ static void s2io_vlan_rx_register(struct net_device *dev, | |||
| 293 | spin_unlock_irqrestore(&nic->tx_lock, flags); | 301 | spin_unlock_irqrestore(&nic->tx_lock, flags); |
| 294 | } | 302 | } |
| 295 | 303 | ||
| 304 | /* A flag indicating whether 'RX_PA_CFG_STRIP_VLAN_TAG' bit is set or not */ | ||
| 305 | int vlan_strip_flag; | ||
| 306 | |||
| 296 | /* Unregister the vlan */ | 307 | /* Unregister the vlan */ |
| 297 | static void s2io_vlan_rx_kill_vid(struct net_device *dev, unsigned long vid) | 308 | static void s2io_vlan_rx_kill_vid(struct net_device *dev, unsigned long vid) |
| 298 | { | 309 | { |
| @@ -404,6 +415,7 @@ S2IO_PARM_INT(indicate_max_pkts, 0); | |||
| 404 | 415 | ||
| 405 | S2IO_PARM_INT(napi, 1); | 416 | S2IO_PARM_INT(napi, 1); |
| 406 | S2IO_PARM_INT(ufo, 0); | 417 | S2IO_PARM_INT(ufo, 0); |
| 418 | S2IO_PARM_INT(vlan_tag_strip, NO_STRIP_IN_PROMISC); | ||
| 407 | 419 | ||
| 408 | static unsigned int tx_fifo_len[MAX_TX_FIFOS] = | 420 | static unsigned int tx_fifo_len[MAX_TX_FIFOS] = |
| 409 | {DEFAULT_FIFO_0_LEN, [1 ...(MAX_TX_FIFOS - 1)] = DEFAULT_FIFO_1_7_LEN}; | 421 | {DEFAULT_FIFO_0_LEN, [1 ...(MAX_TX_FIFOS - 1)] = DEFAULT_FIFO_1_7_LEN}; |
| @@ -1371,7 +1383,7 @@ static int init_nic(struct s2io_nic *nic) | |||
| 1371 | &bar0->rts_frm_len_n[i]); | 1383 | &bar0->rts_frm_len_n[i]); |
| 1372 | } | 1384 | } |
| 1373 | } | 1385 | } |
| 1374 | 1386 | ||
| 1375 | /* Disable differentiated services steering logic */ | 1387 | /* Disable differentiated services steering logic */ |
| 1376 | for (i = 0; i < 64; i++) { | 1388 | for (i = 0; i < 64; i++) { |
| 1377 | if (rts_ds_steer(nic, i, 0) == FAILURE) { | 1389 | if (rts_ds_steer(nic, i, 0) == FAILURE) { |
| @@ -1953,6 +1965,13 @@ static int start_nic(struct s2io_nic *nic) | |||
| 1953 | writeq(val64, &bar0->rx_pa_cfg); | 1965 | writeq(val64, &bar0->rx_pa_cfg); |
| 1954 | } | 1966 | } |
| 1955 | 1967 | ||
| 1968 | if (vlan_tag_strip == 0) { | ||
| 1969 | val64 = readq(&bar0->rx_pa_cfg); | ||
| 1970 | val64 &= ~RX_PA_CFG_STRIP_VLAN_TAG; | ||
| 1971 | writeq(val64, &bar0->rx_pa_cfg); | ||
| 1972 | vlan_strip_flag = 0; | ||
| 1973 | } | ||
| 1974 | |||
| 1956 | /* | 1975 | /* |
| 1957 | * Enabling MC-RLDRAM. After enabling the device, we timeout | 1976 | * Enabling MC-RLDRAM. After enabling the device, we timeout |
| 1958 | * for around 100ms, which is approximately the time required | 1977 | * for around 100ms, which is approximately the time required |
| @@ -4352,6 +4371,13 @@ static void s2io_set_multicast(struct net_device *dev) | |||
| 4352 | writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key); | 4371 | writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key); |
| 4353 | writel((u32) (val64 >> 32), (add + 4)); | 4372 | writel((u32) (val64 >> 32), (add + 4)); |
| 4354 | 4373 | ||
| 4374 | if (vlan_tag_strip != 1) { | ||
| 4375 | val64 = readq(&bar0->rx_pa_cfg); | ||
| 4376 | val64 &= ~RX_PA_CFG_STRIP_VLAN_TAG; | ||
| 4377 | writeq(val64, &bar0->rx_pa_cfg); | ||
| 4378 | vlan_strip_flag = 0; | ||
| 4379 | } | ||
| 4380 | |||
| 4355 | val64 = readq(&bar0->mac_cfg); | 4381 | val64 = readq(&bar0->mac_cfg); |
| 4356 | sp->promisc_flg = 1; | 4382 | sp->promisc_flg = 1; |
| 4357 | DBG_PRINT(INFO_DBG, "%s: entered promiscuous mode\n", | 4383 | DBG_PRINT(INFO_DBG, "%s: entered promiscuous mode\n", |
| @@ -4367,6 +4393,13 @@ static void s2io_set_multicast(struct net_device *dev) | |||
| 4367 | writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key); | 4393 | writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key); |
| 4368 | writel((u32) (val64 >> 32), (add + 4)); | 4394 | writel((u32) (val64 >> 32), (add + 4)); |
| 4369 | 4395 | ||
| 4396 | if (vlan_tag_strip != 0) { | ||
| 4397 | val64 = readq(&bar0->rx_pa_cfg); | ||
| 4398 | val64 |= RX_PA_CFG_STRIP_VLAN_TAG; | ||
| 4399 | writeq(val64, &bar0->rx_pa_cfg); | ||
| 4400 | vlan_strip_flag = 1; | ||
| 4401 | } | ||
| 4402 | |||
| 4370 | val64 = readq(&bar0->mac_cfg); | 4403 | val64 = readq(&bar0->mac_cfg); |
| 4371 | sp->promisc_flg = 0; | 4404 | sp->promisc_flg = 0; |
| 4372 | DBG_PRINT(INFO_DBG, "%s: left promiscuous mode\n", | 4405 | DBG_PRINT(INFO_DBG, "%s: left promiscuous mode\n", |
| @@ -6614,7 +6647,8 @@ static int rx_osm_handler(struct ring_info *ring_data, struct RxD_t * rxdp) | |||
| 6614 | 6647 | ||
| 6615 | if (!sp->lro) { | 6648 | if (!sp->lro) { |
| 6616 | skb->protocol = eth_type_trans(skb, dev); | 6649 | skb->protocol = eth_type_trans(skb, dev); |
| 6617 | if (sp->vlgrp && RXD_GET_VLAN_TAG(rxdp->Control_2)) { | 6650 | if ((sp->vlgrp && RXD_GET_VLAN_TAG(rxdp->Control_2) && |
| 6651 | vlan_strip_flag)) { | ||
| 6618 | /* Queueing the vlan frame to the upper layer */ | 6652 | /* Queueing the vlan frame to the upper layer */ |
| 6619 | if (napi) | 6653 | if (napi) |
| 6620 | vlan_hwaccel_receive_skb(skb, sp->vlgrp, | 6654 | vlan_hwaccel_receive_skb(skb, sp->vlgrp, |
diff --git a/drivers/net/s2io.h b/drivers/net/s2io.h index d23a50f3b70d..803137ca4b6c 100644 --- a/drivers/net/s2io.h +++ b/drivers/net/s2io.h | |||
| @@ -297,6 +297,9 @@ struct stat_block { | |||
| 297 | struct xpakStat xpak_stat; | 297 | struct xpakStat xpak_stat; |
| 298 | }; | 298 | }; |
| 299 | 299 | ||
| 300 | /* Default value for 'vlan_strip_tag' configuration parameter */ | ||
| 301 | #define NO_STRIP_IN_PROMISC 2 | ||
| 302 | |||
| 300 | /* | 303 | /* |
| 301 | * Structures representing different init time configuration | 304 | * Structures representing different init time configuration |
| 302 | * parameters of the NIC. | 305 | * parameters of the NIC. |
