diff options
Diffstat (limited to 'drivers/net')
35 files changed, 267 insertions, 405 deletions
diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c index a2c47476804d..e8f133e926aa 100644 --- a/drivers/net/bonding/bond_alb.c +++ b/drivers/net/bonding/bond_alb.c | |||
| @@ -730,7 +730,7 @@ static struct slave *rlb_choose_channel(struct sk_buff *skb, struct bonding *bon | |||
| 730 | client_info->ntt = 0; | 730 | client_info->ntt = 0; |
| 731 | } | 731 | } |
| 732 | 732 | ||
| 733 | if (!vlan_get_tag(skb, &client_info->vlan_id)) | 733 | if (vlan_get_tag(skb, &client_info->vlan_id)) |
| 734 | client_info->vlan_id = 0; | 734 | client_info->vlan_id = 0; |
| 735 | 735 | ||
| 736 | if (!client_info->assigned) { | 736 | if (!client_info->assigned) { |
diff --git a/drivers/net/bonding/bond_options.c b/drivers/net/bonding/bond_options.c index c37878432717..298c26509095 100644 --- a/drivers/net/bonding/bond_options.c +++ b/drivers/net/bonding/bond_options.c | |||
| @@ -121,6 +121,7 @@ static struct bond_opt_value bond_resend_igmp_tbl[] = { | |||
| 121 | static struct bond_opt_value bond_lp_interval_tbl[] = { | 121 | static struct bond_opt_value bond_lp_interval_tbl[] = { |
| 122 | { "minval", 1, BOND_VALFLAG_MIN | BOND_VALFLAG_DEFAULT}, | 122 | { "minval", 1, BOND_VALFLAG_MIN | BOND_VALFLAG_DEFAULT}, |
| 123 | { "maxval", INT_MAX, BOND_VALFLAG_MAX}, | 123 | { "maxval", INT_MAX, BOND_VALFLAG_MAX}, |
| 124 | { NULL, -1, 0}, | ||
| 124 | }; | 125 | }; |
| 125 | 126 | ||
| 126 | static struct bond_option bond_opts[] = { | 127 | static struct bond_option bond_opts[] = { |
diff --git a/drivers/net/ethernet/broadcom/bnx2.c b/drivers/net/ethernet/broadcom/bnx2.c index cda25ac45b47..6c9e1c9bdeb8 100644 --- a/drivers/net/ethernet/broadcom/bnx2.c +++ b/drivers/net/ethernet/broadcom/bnx2.c | |||
| @@ -2507,6 +2507,7 @@ bnx2_fw_sync(struct bnx2 *bp, u32 msg_data, int ack, int silent) | |||
| 2507 | 2507 | ||
| 2508 | bp->fw_wr_seq++; | 2508 | bp->fw_wr_seq++; |
| 2509 | msg_data |= bp->fw_wr_seq; | 2509 | msg_data |= bp->fw_wr_seq; |
| 2510 | bp->fw_last_msg = msg_data; | ||
| 2510 | 2511 | ||
| 2511 | bnx2_shmem_wr(bp, BNX2_DRV_MB, msg_data); | 2512 | bnx2_shmem_wr(bp, BNX2_DRV_MB, msg_data); |
| 2512 | 2513 | ||
| @@ -4000,8 +4001,23 @@ bnx2_setup_wol(struct bnx2 *bp) | |||
| 4000 | wol_msg = BNX2_DRV_MSG_CODE_SUSPEND_NO_WOL; | 4001 | wol_msg = BNX2_DRV_MSG_CODE_SUSPEND_NO_WOL; |
| 4001 | } | 4002 | } |
| 4002 | 4003 | ||
| 4003 | if (!(bp->flags & BNX2_FLAG_NO_WOL)) | 4004 | if (!(bp->flags & BNX2_FLAG_NO_WOL)) { |
| 4004 | bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT3 | wol_msg, 1, 0); | 4005 | u32 val; |
| 4006 | |||
| 4007 | wol_msg |= BNX2_DRV_MSG_DATA_WAIT3; | ||
| 4008 | if (bp->fw_last_msg || BNX2_CHIP(bp) != BNX2_CHIP_5709) { | ||
| 4009 | bnx2_fw_sync(bp, wol_msg, 1, 0); | ||
| 4010 | return; | ||
| 4011 | } | ||
| 4012 | /* Tell firmware not to power down the PHY yet, otherwise | ||
| 4013 | * the chip will take a long time to respond to MMIO reads. | ||
| 4014 | */ | ||
| 4015 | val = bnx2_shmem_rd(bp, BNX2_PORT_FEATURE); | ||
| 4016 | bnx2_shmem_wr(bp, BNX2_PORT_FEATURE, | ||
| 4017 | val | BNX2_PORT_FEATURE_ASF_ENABLED); | ||
| 4018 | bnx2_fw_sync(bp, wol_msg, 1, 0); | ||
| 4019 | bnx2_shmem_wr(bp, BNX2_PORT_FEATURE, val); | ||
| 4020 | } | ||
| 4005 | 4021 | ||
| 4006 | } | 4022 | } |
| 4007 | 4023 | ||
| @@ -4033,9 +4049,22 @@ bnx2_set_power_state(struct bnx2 *bp, pci_power_t state) | |||
| 4033 | 4049 | ||
| 4034 | if (bp->wol) | 4050 | if (bp->wol) |
| 4035 | pci_set_power_state(bp->pdev, PCI_D3hot); | 4051 | pci_set_power_state(bp->pdev, PCI_D3hot); |
| 4036 | } else { | 4052 | break; |
| 4037 | pci_set_power_state(bp->pdev, PCI_D3hot); | 4053 | |
| 4054 | } | ||
| 4055 | if (!bp->fw_last_msg && BNX2_CHIP(bp) == BNX2_CHIP_5709) { | ||
| 4056 | u32 val; | ||
| 4057 | |||
| 4058 | /* Tell firmware not to power down the PHY yet, | ||
| 4059 | * otherwise the other port may not respond to | ||
| 4060 | * MMIO reads. | ||
| 4061 | */ | ||
| 4062 | val = bnx2_shmem_rd(bp, BNX2_BC_STATE_CONDITION); | ||
| 4063 | val &= ~BNX2_CONDITION_PM_STATE_MASK; | ||
| 4064 | val |= BNX2_CONDITION_PM_STATE_UNPREP; | ||
| 4065 | bnx2_shmem_wr(bp, BNX2_BC_STATE_CONDITION, val); | ||
| 4038 | } | 4066 | } |
| 4067 | pci_set_power_state(bp->pdev, PCI_D3hot); | ||
| 4039 | 4068 | ||
| 4040 | /* No more memory access after this point until | 4069 | /* No more memory access after this point until |
| 4041 | * device is brought back to D0. | 4070 | * device is brought back to D0. |
diff --git a/drivers/net/ethernet/broadcom/bnx2.h b/drivers/net/ethernet/broadcom/bnx2.h index f1cf2c44e7ed..e341bc366fa5 100644 --- a/drivers/net/ethernet/broadcom/bnx2.h +++ b/drivers/net/ethernet/broadcom/bnx2.h | |||
| @@ -6900,6 +6900,7 @@ struct bnx2 { | |||
| 6900 | 6900 | ||
| 6901 | u16 fw_wr_seq; | 6901 | u16 fw_wr_seq; |
| 6902 | u16 fw_drv_pulse_wr_seq; | 6902 | u16 fw_drv_pulse_wr_seq; |
| 6903 | u32 fw_last_msg; | ||
| 6903 | 6904 | ||
| 6904 | int rx_max_ring; | 6905 | int rx_max_ring; |
| 6905 | int rx_ring_size; | 6906 | int rx_ring_size; |
| @@ -7406,6 +7407,10 @@ struct bnx2_rv2p_fw_file { | |||
| 7406 | #define BNX2_CONDITION_MFW_RUN_NCSI 0x00006000 | 7407 | #define BNX2_CONDITION_MFW_RUN_NCSI 0x00006000 |
| 7407 | #define BNX2_CONDITION_MFW_RUN_NONE 0x0000e000 | 7408 | #define BNX2_CONDITION_MFW_RUN_NONE 0x0000e000 |
| 7408 | #define BNX2_CONDITION_MFW_RUN_MASK 0x0000e000 | 7409 | #define BNX2_CONDITION_MFW_RUN_MASK 0x0000e000 |
| 7410 | #define BNX2_CONDITION_PM_STATE_MASK 0x00030000 | ||
| 7411 | #define BNX2_CONDITION_PM_STATE_FULL 0x00030000 | ||
| 7412 | #define BNX2_CONDITION_PM_STATE_PREP 0x00020000 | ||
| 7413 | #define BNX2_CONDITION_PM_STATE_UNPREP 0x00010000 | ||
| 7409 | 7414 | ||
| 7410 | #define BNX2_BC_STATE_DEBUG_CMD 0x1dc | 7415 | #define BNX2_BC_STATE_DEBUG_CMD 0x1dc |
| 7411 | #define BNX2_BC_STATE_BC_DBG_CMD_SIGNATURE 0x42440000 | 7416 | #define BNX2_BC_STATE_BC_DBG_CMD_SIGNATURE 0x42440000 |
diff --git a/drivers/net/ethernet/brocade/bna/bfa_ioc.c b/drivers/net/ethernet/brocade/bna/bfa_ioc.c index 1803c3959044..354ae9792bad 100644 --- a/drivers/net/ethernet/brocade/bna/bfa_ioc.c +++ b/drivers/net/ethernet/brocade/bna/bfa_ioc.c | |||
| @@ -1704,7 +1704,7 @@ bfa_flash_sem_get(void __iomem *bar) | |||
| 1704 | while (!bfa_raw_sem_get(bar)) { | 1704 | while (!bfa_raw_sem_get(bar)) { |
| 1705 | if (--n <= 0) | 1705 | if (--n <= 0) |
| 1706 | return BFA_STATUS_BADFLASH; | 1706 | return BFA_STATUS_BADFLASH; |
| 1707 | udelay(10000); | 1707 | mdelay(10); |
| 1708 | } | 1708 | } |
| 1709 | return BFA_STATUS_OK; | 1709 | return BFA_STATUS_OK; |
| 1710 | } | 1710 | } |
diff --git a/drivers/net/ethernet/cadence/macb.c b/drivers/net/ethernet/cadence/macb.c index 3190d38e16fb..d0c38e01e99f 100644 --- a/drivers/net/ethernet/cadence/macb.c +++ b/drivers/net/ethernet/cadence/macb.c | |||
| @@ -632,11 +632,16 @@ static void gem_rx_refill(struct macb *bp) | |||
| 632 | "Unable to allocate sk_buff\n"); | 632 | "Unable to allocate sk_buff\n"); |
| 633 | break; | 633 | break; |
| 634 | } | 634 | } |
| 635 | bp->rx_skbuff[entry] = skb; | ||
| 636 | 635 | ||
| 637 | /* now fill corresponding descriptor entry */ | 636 | /* now fill corresponding descriptor entry */ |
| 638 | paddr = dma_map_single(&bp->pdev->dev, skb->data, | 637 | paddr = dma_map_single(&bp->pdev->dev, skb->data, |
| 639 | bp->rx_buffer_size, DMA_FROM_DEVICE); | 638 | bp->rx_buffer_size, DMA_FROM_DEVICE); |
| 639 | if (dma_mapping_error(&bp->pdev->dev, paddr)) { | ||
| 640 | dev_kfree_skb(skb); | ||
| 641 | break; | ||
| 642 | } | ||
| 643 | |||
| 644 | bp->rx_skbuff[entry] = skb; | ||
| 640 | 645 | ||
| 641 | if (entry == RX_RING_SIZE - 1) | 646 | if (entry == RX_RING_SIZE - 1) |
| 642 | paddr |= MACB_BIT(RX_WRAP); | 647 | paddr |= MACB_BIT(RX_WRAP); |
| @@ -725,7 +730,7 @@ static int gem_rx(struct macb *bp, int budget) | |||
| 725 | skb_put(skb, len); | 730 | skb_put(skb, len); |
| 726 | addr = MACB_BF(RX_WADDR, MACB_BFEXT(RX_WADDR, addr)); | 731 | addr = MACB_BF(RX_WADDR, MACB_BFEXT(RX_WADDR, addr)); |
| 727 | dma_unmap_single(&bp->pdev->dev, addr, | 732 | dma_unmap_single(&bp->pdev->dev, addr, |
| 728 | len, DMA_FROM_DEVICE); | 733 | bp->rx_buffer_size, DMA_FROM_DEVICE); |
| 729 | 734 | ||
| 730 | skb->protocol = eth_type_trans(skb, bp->dev); | 735 | skb->protocol = eth_type_trans(skb, bp->dev); |
| 731 | skb_checksum_none_assert(skb); | 736 | skb_checksum_none_assert(skb); |
| @@ -1036,11 +1041,15 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 1036 | } | 1041 | } |
| 1037 | 1042 | ||
| 1038 | entry = macb_tx_ring_wrap(bp->tx_head); | 1043 | entry = macb_tx_ring_wrap(bp->tx_head); |
| 1039 | bp->tx_head++; | ||
| 1040 | netdev_vdbg(bp->dev, "Allocated ring entry %u\n", entry); | 1044 | netdev_vdbg(bp->dev, "Allocated ring entry %u\n", entry); |
| 1041 | mapping = dma_map_single(&bp->pdev->dev, skb->data, | 1045 | mapping = dma_map_single(&bp->pdev->dev, skb->data, |
| 1042 | len, DMA_TO_DEVICE); | 1046 | len, DMA_TO_DEVICE); |
| 1047 | if (dma_mapping_error(&bp->pdev->dev, mapping)) { | ||
| 1048 | kfree_skb(skb); | ||
| 1049 | goto unlock; | ||
| 1050 | } | ||
| 1043 | 1051 | ||
| 1052 | bp->tx_head++; | ||
| 1044 | tx_skb = &bp->tx_skb[entry]; | 1053 | tx_skb = &bp->tx_skb[entry]; |
| 1045 | tx_skb->skb = skb; | 1054 | tx_skb->skb = skb; |
| 1046 | tx_skb->mapping = mapping; | 1055 | tx_skb->mapping = mapping; |
| @@ -1066,6 +1075,7 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 1066 | if (CIRC_SPACE(bp->tx_head, bp->tx_tail, TX_RING_SIZE) < 1) | 1075 | if (CIRC_SPACE(bp->tx_head, bp->tx_tail, TX_RING_SIZE) < 1) |
| 1067 | netif_stop_queue(dev); | 1076 | netif_stop_queue(dev); |
| 1068 | 1077 | ||
| 1078 | unlock: | ||
| 1069 | spin_unlock_irqrestore(&bp->lock, flags); | 1079 | spin_unlock_irqrestore(&bp->lock, flags); |
| 1070 | 1080 | ||
| 1071 | return NETDEV_TX_OK; | 1081 | return NETDEV_TX_OK; |
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 479a7cba45c0..03a351300013 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c | |||
| @@ -528,13 +528,6 @@ fec_restart(struct net_device *ndev, int duplex) | |||
| 528 | /* Clear any outstanding interrupt. */ | 528 | /* Clear any outstanding interrupt. */ |
| 529 | writel(0xffc00000, fep->hwp + FEC_IEVENT); | 529 | writel(0xffc00000, fep->hwp + FEC_IEVENT); |
| 530 | 530 | ||
| 531 | /* Setup multicast filter. */ | ||
| 532 | set_multicast_list(ndev); | ||
| 533 | #ifndef CONFIG_M5272 | ||
| 534 | writel(0, fep->hwp + FEC_HASH_TABLE_HIGH); | ||
| 535 | writel(0, fep->hwp + FEC_HASH_TABLE_LOW); | ||
| 536 | #endif | ||
| 537 | |||
| 538 | /* Set maximum receive buffer size. */ | 531 | /* Set maximum receive buffer size. */ |
| 539 | writel(PKT_MAXBLR_SIZE, fep->hwp + FEC_R_BUFF_SIZE); | 532 | writel(PKT_MAXBLR_SIZE, fep->hwp + FEC_R_BUFF_SIZE); |
| 540 | 533 | ||
| @@ -655,6 +648,13 @@ fec_restart(struct net_device *ndev, int duplex) | |||
| 655 | 648 | ||
| 656 | writel(rcntl, fep->hwp + FEC_R_CNTRL); | 649 | writel(rcntl, fep->hwp + FEC_R_CNTRL); |
| 657 | 650 | ||
| 651 | /* Setup multicast filter. */ | ||
| 652 | set_multicast_list(ndev); | ||
| 653 | #ifndef CONFIG_M5272 | ||
| 654 | writel(0, fep->hwp + FEC_HASH_TABLE_HIGH); | ||
| 655 | writel(0, fep->hwp + FEC_HASH_TABLE_LOW); | ||
| 656 | #endif | ||
| 657 | |||
| 658 | if (id_entry->driver_data & FEC_QUIRK_ENET_MAC) { | 658 | if (id_entry->driver_data & FEC_QUIRK_ENET_MAC) { |
| 659 | /* enable ENET endian swap */ | 659 | /* enable ENET endian swap */ |
| 660 | ecntl |= (1 << 8); | 660 | ecntl |= (1 << 8); |
diff --git a/drivers/net/ethernet/ibm/ibmveth.c b/drivers/net/ethernet/ibm/ibmveth.c index 4be971590461..1fc8334fc181 100644 --- a/drivers/net/ethernet/ibm/ibmveth.c +++ b/drivers/net/ethernet/ibm/ibmveth.c | |||
| @@ -522,10 +522,21 @@ retry: | |||
| 522 | return rc; | 522 | return rc; |
| 523 | } | 523 | } |
| 524 | 524 | ||
| 525 | static u64 ibmveth_encode_mac_addr(u8 *mac) | ||
| 526 | { | ||
| 527 | int i; | ||
| 528 | u64 encoded = 0; | ||
| 529 | |||
| 530 | for (i = 0; i < ETH_ALEN; i++) | ||
| 531 | encoded = (encoded << 8) | mac[i]; | ||
| 532 | |||
| 533 | return encoded; | ||
| 534 | } | ||
| 535 | |||
| 525 | static int ibmveth_open(struct net_device *netdev) | 536 | static int ibmveth_open(struct net_device *netdev) |
| 526 | { | 537 | { |
| 527 | struct ibmveth_adapter *adapter = netdev_priv(netdev); | 538 | struct ibmveth_adapter *adapter = netdev_priv(netdev); |
| 528 | u64 mac_address = 0; | 539 | u64 mac_address; |
| 529 | int rxq_entries = 1; | 540 | int rxq_entries = 1; |
| 530 | unsigned long lpar_rc; | 541 | unsigned long lpar_rc; |
| 531 | int rc; | 542 | int rc; |
| @@ -579,8 +590,7 @@ static int ibmveth_open(struct net_device *netdev) | |||
| 579 | adapter->rx_queue.num_slots = rxq_entries; | 590 | adapter->rx_queue.num_slots = rxq_entries; |
| 580 | adapter->rx_queue.toggle = 1; | 591 | adapter->rx_queue.toggle = 1; |
| 581 | 592 | ||
| 582 | memcpy(&mac_address, netdev->dev_addr, netdev->addr_len); | 593 | mac_address = ibmveth_encode_mac_addr(netdev->dev_addr); |
| 583 | mac_address = mac_address >> 16; | ||
| 584 | 594 | ||
| 585 | rxq_desc.fields.flags_len = IBMVETH_BUF_VALID | | 595 | rxq_desc.fields.flags_len = IBMVETH_BUF_VALID | |
| 586 | adapter->rx_queue.queue_len; | 596 | adapter->rx_queue.queue_len; |
| @@ -1183,8 +1193,8 @@ static void ibmveth_set_multicast_list(struct net_device *netdev) | |||
| 1183 | /* add the addresses to the filter table */ | 1193 | /* add the addresses to the filter table */ |
| 1184 | netdev_for_each_mc_addr(ha, netdev) { | 1194 | netdev_for_each_mc_addr(ha, netdev) { |
| 1185 | /* add the multicast address to the filter table */ | 1195 | /* add the multicast address to the filter table */ |
| 1186 | unsigned long mcast_addr = 0; | 1196 | u64 mcast_addr; |
| 1187 | memcpy(((char *)&mcast_addr)+2, ha->addr, ETH_ALEN); | 1197 | mcast_addr = ibmveth_encode_mac_addr(ha->addr); |
| 1188 | lpar_rc = h_multicast_ctrl(adapter->vdev->unit_address, | 1198 | lpar_rc = h_multicast_ctrl(adapter->vdev->unit_address, |
| 1189 | IbmVethMcastAddFilter, | 1199 | IbmVethMcastAddFilter, |
| 1190 | mcast_addr); | 1200 | mcast_addr); |
| @@ -1372,9 +1382,6 @@ static int ibmveth_probe(struct vio_dev *dev, const struct vio_device_id *id) | |||
| 1372 | 1382 | ||
| 1373 | netif_napi_add(netdev, &adapter->napi, ibmveth_poll, 16); | 1383 | netif_napi_add(netdev, &adapter->napi, ibmveth_poll, 16); |
| 1374 | 1384 | ||
| 1375 | adapter->mac_addr = 0; | ||
| 1376 | memcpy(&adapter->mac_addr, mac_addr_p, ETH_ALEN); | ||
| 1377 | |||
| 1378 | netdev->irq = dev->irq; | 1385 | netdev->irq = dev->irq; |
| 1379 | netdev->netdev_ops = &ibmveth_netdev_ops; | 1386 | netdev->netdev_ops = &ibmveth_netdev_ops; |
| 1380 | netdev->ethtool_ops = &netdev_ethtool_ops; | 1387 | netdev->ethtool_ops = &netdev_ethtool_ops; |
| @@ -1383,7 +1390,7 @@ static int ibmveth_probe(struct vio_dev *dev, const struct vio_device_id *id) | |||
| 1383 | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM; | 1390 | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM; |
| 1384 | netdev->features |= netdev->hw_features; | 1391 | netdev->features |= netdev->hw_features; |
| 1385 | 1392 | ||
| 1386 | memcpy(netdev->dev_addr, &adapter->mac_addr, netdev->addr_len); | 1393 | memcpy(netdev->dev_addr, mac_addr_p, ETH_ALEN); |
| 1387 | 1394 | ||
| 1388 | for (i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++) { | 1395 | for (i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++) { |
| 1389 | struct kobject *kobj = &adapter->rx_buff_pool[i].kobj; | 1396 | struct kobject *kobj = &adapter->rx_buff_pool[i].kobj; |
diff --git a/drivers/net/ethernet/ibm/ibmveth.h b/drivers/net/ethernet/ibm/ibmveth.h index 451ba7949e15..1f37499d4398 100644 --- a/drivers/net/ethernet/ibm/ibmveth.h +++ b/drivers/net/ethernet/ibm/ibmveth.h | |||
| @@ -138,7 +138,6 @@ struct ibmveth_adapter { | |||
| 138 | struct napi_struct napi; | 138 | struct napi_struct napi; |
| 139 | struct net_device_stats stats; | 139 | struct net_device_stats stats; |
| 140 | unsigned int mcastFilterSize; | 140 | unsigned int mcastFilterSize; |
| 141 | unsigned long mac_addr; | ||
| 142 | void * buffer_list_addr; | 141 | void * buffer_list_addr; |
| 143 | void * filter_list_addr; | 142 | void * filter_list_addr; |
| 144 | dma_addr_t buffer_list_dma; | 143 | dma_addr_t buffer_list_dma; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c index fad45316200a..84a96f70dfb5 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c | |||
| @@ -742,6 +742,14 @@ static int mlx4_en_replace_mac(struct mlx4_en_priv *priv, int qpn, | |||
| 742 | err = mlx4_en_uc_steer_add(priv, new_mac, | 742 | err = mlx4_en_uc_steer_add(priv, new_mac, |
| 743 | &qpn, | 743 | &qpn, |
| 744 | &entry->reg_id); | 744 | &entry->reg_id); |
| 745 | if (err) | ||
| 746 | return err; | ||
| 747 | if (priv->tunnel_reg_id) { | ||
| 748 | mlx4_flow_detach(priv->mdev->dev, priv->tunnel_reg_id); | ||
| 749 | priv->tunnel_reg_id = 0; | ||
| 750 | } | ||
| 751 | err = mlx4_en_tunnel_steer_add(priv, new_mac, qpn, | ||
| 752 | &priv->tunnel_reg_id); | ||
| 745 | return err; | 753 | return err; |
| 746 | } | 754 | } |
| 747 | } | 755 | } |
| @@ -1792,6 +1800,8 @@ void mlx4_en_stop_port(struct net_device *dev, int detach) | |||
| 1792 | mc_list[5] = priv->port; | 1800 | mc_list[5] = priv->port; |
| 1793 | mlx4_multicast_detach(mdev->dev, &priv->rss_map.indir_qp, | 1801 | mlx4_multicast_detach(mdev->dev, &priv->rss_map.indir_qp, |
| 1794 | mc_list, MLX4_PROT_ETH, mclist->reg_id); | 1802 | mc_list, MLX4_PROT_ETH, mclist->reg_id); |
| 1803 | if (mclist->tunnel_reg_id) | ||
| 1804 | mlx4_flow_detach(mdev->dev, mclist->tunnel_reg_id); | ||
| 1795 | } | 1805 | } |
| 1796 | mlx4_en_clear_list(dev); | 1806 | mlx4_en_clear_list(dev); |
| 1797 | list_for_each_entry_safe(mclist, tmp, &priv->curr_list, list) { | 1807 | list_for_each_entry_safe(mclist, tmp, &priv->curr_list, list) { |
diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c index 91b69ff4b4a2..7e2995ecea6f 100644 --- a/drivers/net/ethernet/mellanox/mlx4/fw.c +++ b/drivers/net/ethernet/mellanox/mlx4/fw.c | |||
| @@ -129,13 +129,14 @@ static void dump_dev_cap_flags2(struct mlx4_dev *dev, u64 flags) | |||
| 129 | [0] = "RSS support", | 129 | [0] = "RSS support", |
| 130 | [1] = "RSS Toeplitz Hash Function support", | 130 | [1] = "RSS Toeplitz Hash Function support", |
| 131 | [2] = "RSS XOR Hash Function support", | 131 | [2] = "RSS XOR Hash Function support", |
| 132 | [3] = "Device manage flow steering support", | 132 | [3] = "Device managed flow steering support", |
| 133 | [4] = "Automatic MAC reassignment support", | 133 | [4] = "Automatic MAC reassignment support", |
| 134 | [5] = "Time stamping support", | 134 | [5] = "Time stamping support", |
| 135 | [6] = "VST (control vlan insertion/stripping) support", | 135 | [6] = "VST (control vlan insertion/stripping) support", |
| 136 | [7] = "FSM (MAC anti-spoofing) support", | 136 | [7] = "FSM (MAC anti-spoofing) support", |
| 137 | [8] = "Dynamic QP updates support", | 137 | [8] = "Dynamic QP updates support", |
| 138 | [9] = "TCP/IP offloads/flow-steering for VXLAN support" | 138 | [9] = "Device managed flow steering IPoIB support", |
| 139 | [10] = "TCP/IP offloads/flow-steering for VXLAN support" | ||
| 139 | }; | 140 | }; |
| 140 | int i; | 141 | int i; |
| 141 | 142 | ||
| @@ -859,7 +860,7 @@ int mlx4_QUERY_DEV_CAP_wrapper(struct mlx4_dev *dev, int slave, | |||
| 859 | MLX4_PUT(outbox->buf, field, QUERY_DEV_CAP_CQ_TS_SUPPORT_OFFSET); | 860 | MLX4_PUT(outbox->buf, field, QUERY_DEV_CAP_CQ_TS_SUPPORT_OFFSET); |
| 860 | 861 | ||
| 861 | /* For guests, disable vxlan tunneling */ | 862 | /* For guests, disable vxlan tunneling */ |
| 862 | MLX4_GET(field, outbox, QUERY_DEV_CAP_VXLAN); | 863 | MLX4_GET(field, outbox->buf, QUERY_DEV_CAP_VXLAN); |
| 863 | field &= 0xf7; | 864 | field &= 0xf7; |
| 864 | MLX4_PUT(outbox->buf, field, QUERY_DEV_CAP_VXLAN); | 865 | MLX4_PUT(outbox->buf, field, QUERY_DEV_CAP_VXLAN); |
| 865 | 866 | ||
| @@ -869,7 +870,7 @@ int mlx4_QUERY_DEV_CAP_wrapper(struct mlx4_dev *dev, int slave, | |||
| 869 | MLX4_PUT(outbox->buf, field, QUERY_DEV_CAP_BF_OFFSET); | 870 | MLX4_PUT(outbox->buf, field, QUERY_DEV_CAP_BF_OFFSET); |
| 870 | 871 | ||
| 871 | /* For guests, disable mw type 2 */ | 872 | /* For guests, disable mw type 2 */ |
| 872 | MLX4_GET(bmme_flags, outbox, QUERY_DEV_CAP_BMME_FLAGS_OFFSET); | 873 | MLX4_GET(bmme_flags, outbox->buf, QUERY_DEV_CAP_BMME_FLAGS_OFFSET); |
| 873 | bmme_flags &= ~MLX4_BMME_FLAG_TYPE_2_WIN; | 874 | bmme_flags &= ~MLX4_BMME_FLAG_TYPE_2_WIN; |
| 874 | MLX4_PUT(outbox->buf, bmme_flags, QUERY_DEV_CAP_BMME_FLAGS_OFFSET); | 875 | MLX4_PUT(outbox->buf, bmme_flags, QUERY_DEV_CAP_BMME_FLAGS_OFFSET); |
| 875 | 876 | ||
| @@ -883,7 +884,7 @@ int mlx4_QUERY_DEV_CAP_wrapper(struct mlx4_dev *dev, int slave, | |||
| 883 | } | 884 | } |
| 884 | 885 | ||
| 885 | /* turn off ipoib managed steering for guests */ | 886 | /* turn off ipoib managed steering for guests */ |
| 886 | MLX4_GET(field, outbox, QUERY_DEV_CAP_FLOW_STEERING_IPOIB_OFFSET); | 887 | MLX4_GET(field, outbox->buf, QUERY_DEV_CAP_FLOW_STEERING_IPOIB_OFFSET); |
| 887 | field &= ~0x80; | 888 | field &= ~0x80; |
| 888 | MLX4_PUT(outbox->buf, field, QUERY_DEV_CAP_FLOW_STEERING_IPOIB_OFFSET); | 889 | MLX4_PUT(outbox->buf, field, QUERY_DEV_CAP_FLOW_STEERING_IPOIB_OFFSET); |
| 889 | 890 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c index d711158b0d4b..936c15364739 100644 --- a/drivers/net/ethernet/mellanox/mlx4/main.c +++ b/drivers/net/ethernet/mellanox/mlx4/main.c | |||
| @@ -150,6 +150,8 @@ struct mlx4_port_config { | |||
| 150 | struct pci_dev *pdev; | 150 | struct pci_dev *pdev; |
| 151 | }; | 151 | }; |
| 152 | 152 | ||
| 153 | static atomic_t pf_loading = ATOMIC_INIT(0); | ||
| 154 | |||
| 153 | int mlx4_check_port_params(struct mlx4_dev *dev, | 155 | int mlx4_check_port_params(struct mlx4_dev *dev, |
| 154 | enum mlx4_port_type *port_type) | 156 | enum mlx4_port_type *port_type) |
| 155 | { | 157 | { |
| @@ -749,7 +751,7 @@ static void mlx4_request_modules(struct mlx4_dev *dev) | |||
| 749 | has_eth_port = true; | 751 | has_eth_port = true; |
| 750 | } | 752 | } |
| 751 | 753 | ||
| 752 | if (has_ib_port) | 754 | if (has_ib_port || (dev->caps.flags & MLX4_DEV_CAP_FLAG_IBOE)) |
| 753 | request_module_nowait(IB_DRV_NAME); | 755 | request_module_nowait(IB_DRV_NAME); |
| 754 | if (has_eth_port) | 756 | if (has_eth_port) |
| 755 | request_module_nowait(EN_DRV_NAME); | 757 | request_module_nowait(EN_DRV_NAME); |
| @@ -1407,6 +1409,11 @@ static int mlx4_init_slave(struct mlx4_dev *dev) | |||
| 1407 | u32 slave_read; | 1409 | u32 slave_read; |
| 1408 | u32 cmd_channel_ver; | 1410 | u32 cmd_channel_ver; |
| 1409 | 1411 | ||
| 1412 | if (atomic_read(&pf_loading)) { | ||
| 1413 | mlx4_warn(dev, "PF is not ready. Deferring probe\n"); | ||
| 1414 | return -EPROBE_DEFER; | ||
| 1415 | } | ||
| 1416 | |||
| 1410 | mutex_lock(&priv->cmd.slave_cmd_mutex); | 1417 | mutex_lock(&priv->cmd.slave_cmd_mutex); |
| 1411 | priv->cmd.max_cmds = 1; | 1418 | priv->cmd.max_cmds = 1; |
| 1412 | mlx4_warn(dev, "Sending reset\n"); | 1419 | mlx4_warn(dev, "Sending reset\n"); |
| @@ -2319,7 +2326,11 @@ static int __mlx4_init_one(struct pci_dev *pdev, int pci_dev_data) | |||
| 2319 | 2326 | ||
| 2320 | if (num_vfs) { | 2327 | if (num_vfs) { |
| 2321 | mlx4_warn(dev, "Enabling SR-IOV with %d VFs\n", num_vfs); | 2328 | mlx4_warn(dev, "Enabling SR-IOV with %d VFs\n", num_vfs); |
| 2329 | |||
| 2330 | atomic_inc(&pf_loading); | ||
| 2322 | err = pci_enable_sriov(pdev, num_vfs); | 2331 | err = pci_enable_sriov(pdev, num_vfs); |
| 2332 | atomic_dec(&pf_loading); | ||
| 2333 | |||
| 2323 | if (err) { | 2334 | if (err) { |
| 2324 | mlx4_err(dev, "Failed to enable SR-IOV, continuing without SR-IOV (err = %d).\n", | 2335 | mlx4_err(dev, "Failed to enable SR-IOV, continuing without SR-IOV (err = %d).\n", |
| 2325 | err); | 2336 | err); |
| @@ -2684,6 +2695,7 @@ static struct pci_driver mlx4_driver = { | |||
| 2684 | .name = DRV_NAME, | 2695 | .name = DRV_NAME, |
| 2685 | .id_table = mlx4_pci_table, | 2696 | .id_table = mlx4_pci_table, |
| 2686 | .probe = mlx4_init_one, | 2697 | .probe = mlx4_init_one, |
| 2698 | .shutdown = mlx4_remove_one, | ||
| 2687 | .remove = mlx4_remove_one, | 2699 | .remove = mlx4_remove_one, |
| 2688 | .err_handler = &mlx4_err_handler, | 2700 | .err_handler = &mlx4_err_handler, |
| 2689 | }; | 2701 | }; |
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index e9779653cd4c..3ff7bc3e7a23 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c | |||
| @@ -209,7 +209,7 @@ static const struct { | |||
| 209 | [RTL_GIGA_MAC_VER_16] = | 209 | [RTL_GIGA_MAC_VER_16] = |
| 210 | _R("RTL8101e", RTL_TD_0, NULL, JUMBO_1K, true), | 210 | _R("RTL8101e", RTL_TD_0, NULL, JUMBO_1K, true), |
| 211 | [RTL_GIGA_MAC_VER_17] = | 211 | [RTL_GIGA_MAC_VER_17] = |
| 212 | _R("RTL8168b/8111b", RTL_TD_1, NULL, JUMBO_4K, false), | 212 | _R("RTL8168b/8111b", RTL_TD_0, NULL, JUMBO_4K, false), |
| 213 | [RTL_GIGA_MAC_VER_18] = | 213 | [RTL_GIGA_MAC_VER_18] = |
| 214 | _R("RTL8168cp/8111cp", RTL_TD_1, NULL, JUMBO_6K, false), | 214 | _R("RTL8168cp/8111cp", RTL_TD_1, NULL, JUMBO_6K, false), |
| 215 | [RTL_GIGA_MAC_VER_19] = | 215 | [RTL_GIGA_MAC_VER_19] = |
diff --git a/drivers/net/ethernet/stmicro/stmmac/chain_mode.c b/drivers/net/ethernet/stmicro/stmmac/chain_mode.c index 72d282bf33a5..c553f6b5a913 100644 --- a/drivers/net/ethernet/stmicro/stmmac/chain_mode.c +++ b/drivers/net/ethernet/stmicro/stmmac/chain_mode.c | |||
| @@ -151,7 +151,7 @@ static void stmmac_clean_desc3(void *priv_ptr, struct dma_desc *p) | |||
| 151 | sizeof(struct dma_desc))); | 151 | sizeof(struct dma_desc))); |
| 152 | } | 152 | } |
| 153 | 153 | ||
| 154 | const struct stmmac_chain_mode_ops chain_mode_ops = { | 154 | const struct stmmac_mode_ops chain_mode_ops = { |
| 155 | .init = stmmac_init_dma_chain, | 155 | .init = stmmac_init_dma_chain, |
| 156 | .is_jumbo_frm = stmmac_is_jumbo_frm, | 156 | .is_jumbo_frm = stmmac_is_jumbo_frm, |
| 157 | .jumbo_frm = stmmac_jumbo_frm, | 157 | .jumbo_frm = stmmac_jumbo_frm, |
diff --git a/drivers/net/ethernet/stmicro/stmmac/common.h b/drivers/net/ethernet/stmicro/stmmac/common.h index 7834a3993946..74610f3aca9e 100644 --- a/drivers/net/ethernet/stmicro/stmmac/common.h +++ b/drivers/net/ethernet/stmicro/stmmac/common.h | |||
| @@ -419,20 +419,13 @@ struct mii_regs { | |||
| 419 | unsigned int data; /* MII Data */ | 419 | unsigned int data; /* MII Data */ |
| 420 | }; | 420 | }; |
| 421 | 421 | ||
| 422 | struct stmmac_ring_mode_ops { | 422 | struct stmmac_mode_ops { |
| 423 | unsigned int (*is_jumbo_frm) (int len, int ehn_desc); | ||
| 424 | unsigned int (*jumbo_frm) (void *priv, struct sk_buff *skb, int csum); | ||
| 425 | void (*refill_desc3) (void *priv, struct dma_desc *p); | ||
| 426 | void (*init_desc3) (struct dma_desc *p); | ||
| 427 | void (*clean_desc3) (void *priv, struct dma_desc *p); | ||
| 428 | int (*set_16kib_bfsize) (int mtu); | ||
| 429 | }; | ||
| 430 | |||
| 431 | struct stmmac_chain_mode_ops { | ||
| 432 | void (*init) (void *des, dma_addr_t phy_addr, unsigned int size, | 423 | void (*init) (void *des, dma_addr_t phy_addr, unsigned int size, |
| 433 | unsigned int extend_desc); | 424 | unsigned int extend_desc); |
| 434 | unsigned int (*is_jumbo_frm) (int len, int ehn_desc); | 425 | unsigned int (*is_jumbo_frm) (int len, int ehn_desc); |
| 435 | unsigned int (*jumbo_frm) (void *priv, struct sk_buff *skb, int csum); | 426 | unsigned int (*jumbo_frm) (void *priv, struct sk_buff *skb, int csum); |
| 427 | int (*set_16kib_bfsize)(int mtu); | ||
| 428 | void (*init_desc3)(struct dma_desc *p); | ||
| 436 | void (*refill_desc3) (void *priv, struct dma_desc *p); | 429 | void (*refill_desc3) (void *priv, struct dma_desc *p); |
| 437 | void (*clean_desc3) (void *priv, struct dma_desc *p); | 430 | void (*clean_desc3) (void *priv, struct dma_desc *p); |
| 438 | }; | 431 | }; |
| @@ -441,8 +434,7 @@ struct mac_device_info { | |||
| 441 | const struct stmmac_ops *mac; | 434 | const struct stmmac_ops *mac; |
| 442 | const struct stmmac_desc_ops *desc; | 435 | const struct stmmac_desc_ops *desc; |
| 443 | const struct stmmac_dma_ops *dma; | 436 | const struct stmmac_dma_ops *dma; |
| 444 | const struct stmmac_ring_mode_ops *ring; | 437 | const struct stmmac_mode_ops *mode; |
| 445 | const struct stmmac_chain_mode_ops *chain; | ||
| 446 | const struct stmmac_hwtimestamp *ptp; | 438 | const struct stmmac_hwtimestamp *ptp; |
| 447 | struct mii_regs mii; /* MII register Addresses */ | 439 | struct mii_regs mii; /* MII register Addresses */ |
| 448 | struct mac_link link; | 440 | struct mac_link link; |
| @@ -460,7 +452,7 @@ void stmmac_get_mac_addr(void __iomem *ioaddr, unsigned char *addr, | |||
| 460 | void stmmac_set_mac(void __iomem *ioaddr, bool enable); | 452 | void stmmac_set_mac(void __iomem *ioaddr, bool enable); |
| 461 | 453 | ||
| 462 | void dwmac_dma_flush_tx_fifo(void __iomem *ioaddr); | 454 | void dwmac_dma_flush_tx_fifo(void __iomem *ioaddr); |
| 463 | extern const struct stmmac_ring_mode_ops ring_mode_ops; | 455 | extern const struct stmmac_mode_ops ring_mode_ops; |
| 464 | extern const struct stmmac_chain_mode_ops chain_mode_ops; | 456 | extern const struct stmmac_mode_ops chain_mode_ops; |
| 465 | 457 | ||
| 466 | #endif /* __COMMON_H__ */ | 458 | #endif /* __COMMON_H__ */ |
diff --git a/drivers/net/ethernet/stmicro/stmmac/ring_mode.c b/drivers/net/ethernet/stmicro/stmmac/ring_mode.c index a96c7c2f5f3f..650a4be6bce5 100644 --- a/drivers/net/ethernet/stmicro/stmmac/ring_mode.c +++ b/drivers/net/ethernet/stmicro/stmmac/ring_mode.c | |||
| @@ -100,10 +100,9 @@ static void stmmac_refill_desc3(void *priv_ptr, struct dma_desc *p) | |||
| 100 | { | 100 | { |
| 101 | struct stmmac_priv *priv = (struct stmmac_priv *)priv_ptr; | 101 | struct stmmac_priv *priv = (struct stmmac_priv *)priv_ptr; |
| 102 | 102 | ||
| 103 | if (unlikely(priv->plat->has_gmac)) | 103 | /* Fill DES3 in case of RING mode */ |
| 104 | /* Fill DES3 in case of RING mode */ | 104 | if (priv->dma_buf_sz >= BUF_SIZE_8KiB) |
| 105 | if (priv->dma_buf_sz >= BUF_SIZE_8KiB) | 105 | p->des3 = p->des2 + BUF_SIZE_8KiB; |
| 106 | p->des3 = p->des2 + BUF_SIZE_8KiB; | ||
| 107 | } | 106 | } |
| 108 | 107 | ||
| 109 | /* In ring mode we need to fill the desc3 because it is used as buffer */ | 108 | /* In ring mode we need to fill the desc3 because it is used as buffer */ |
| @@ -126,7 +125,7 @@ static int stmmac_set_16kib_bfsize(int mtu) | |||
| 126 | return ret; | 125 | return ret; |
| 127 | } | 126 | } |
| 128 | 127 | ||
| 129 | const struct stmmac_ring_mode_ops ring_mode_ops = { | 128 | const struct stmmac_mode_ops ring_mode_ops = { |
| 130 | .is_jumbo_frm = stmmac_is_jumbo_frm, | 129 | .is_jumbo_frm = stmmac_is_jumbo_frm, |
| 131 | .jumbo_frm = stmmac_jumbo_frm, | 130 | .jumbo_frm = stmmac_jumbo_frm, |
| 132 | .refill_desc3 = stmmac_refill_desc3, | 131 | .refill_desc3 = stmmac_refill_desc3, |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 078ad0ec8593..8543e1cfd55e 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | |||
| @@ -92,8 +92,8 @@ static int tc = TC_DEFAULT; | |||
| 92 | module_param(tc, int, S_IRUGO | S_IWUSR); | 92 | module_param(tc, int, S_IRUGO | S_IWUSR); |
| 93 | MODULE_PARM_DESC(tc, "DMA threshold control value"); | 93 | MODULE_PARM_DESC(tc, "DMA threshold control value"); |
| 94 | 94 | ||
| 95 | #define DMA_BUFFER_SIZE BUF_SIZE_4KiB | 95 | #define DEFAULT_BUFSIZE 1536 |
| 96 | static int buf_sz = DMA_BUFFER_SIZE; | 96 | static int buf_sz = DEFAULT_BUFSIZE; |
| 97 | module_param(buf_sz, int, S_IRUGO | S_IWUSR); | 97 | module_param(buf_sz, int, S_IRUGO | S_IWUSR); |
| 98 | MODULE_PARM_DESC(buf_sz, "DMA buffer size"); | 98 | MODULE_PARM_DESC(buf_sz, "DMA buffer size"); |
| 99 | 99 | ||
| @@ -136,8 +136,8 @@ static void stmmac_verify_args(void) | |||
| 136 | dma_rxsize = DMA_RX_SIZE; | 136 | dma_rxsize = DMA_RX_SIZE; |
| 137 | if (unlikely(dma_txsize < 0)) | 137 | if (unlikely(dma_txsize < 0)) |
| 138 | dma_txsize = DMA_TX_SIZE; | 138 | dma_txsize = DMA_TX_SIZE; |
| 139 | if (unlikely((buf_sz < DMA_BUFFER_SIZE) || (buf_sz > BUF_SIZE_16KiB))) | 139 | if (unlikely((buf_sz < DEFAULT_BUFSIZE) || (buf_sz > BUF_SIZE_16KiB))) |
| 140 | buf_sz = DMA_BUFFER_SIZE; | 140 | buf_sz = DEFAULT_BUFSIZE; |
| 141 | if (unlikely(flow_ctrl > 1)) | 141 | if (unlikely(flow_ctrl > 1)) |
| 142 | flow_ctrl = FLOW_AUTO; | 142 | flow_ctrl = FLOW_AUTO; |
| 143 | else if (likely(flow_ctrl < 0)) | 143 | else if (likely(flow_ctrl < 0)) |
| @@ -286,10 +286,25 @@ bool stmmac_eee_init(struct stmmac_priv *priv) | |||
| 286 | 286 | ||
| 287 | /* MAC core supports the EEE feature. */ | 287 | /* MAC core supports the EEE feature. */ |
| 288 | if (priv->dma_cap.eee) { | 288 | if (priv->dma_cap.eee) { |
| 289 | int tx_lpi_timer = priv->tx_lpi_timer; | ||
| 290 | |||
| 289 | /* Check if the PHY supports EEE */ | 291 | /* Check if the PHY supports EEE */ |
| 290 | if (phy_init_eee(priv->phydev, 1)) | 292 | if (phy_init_eee(priv->phydev, 1)) { |
| 293 | /* To manage at run-time if the EEE cannot be supported | ||
| 294 | * anymore (for example because the lp caps have been | ||
| 295 | * changed). | ||
| 296 | * In that case the driver disable own timers. | ||
| 297 | */ | ||
| 298 | if (priv->eee_active) { | ||
| 299 | pr_debug("stmmac: disable EEE\n"); | ||
| 300 | del_timer_sync(&priv->eee_ctrl_timer); | ||
| 301 | priv->hw->mac->set_eee_timer(priv->ioaddr, 0, | ||
| 302 | tx_lpi_timer); | ||
| 303 | } | ||
| 304 | priv->eee_active = 0; | ||
| 291 | goto out; | 305 | goto out; |
| 292 | 306 | } | |
| 307 | /* Activate the EEE and start timers */ | ||
| 293 | if (!priv->eee_active) { | 308 | if (!priv->eee_active) { |
| 294 | priv->eee_active = 1; | 309 | priv->eee_active = 1; |
| 295 | init_timer(&priv->eee_ctrl_timer); | 310 | init_timer(&priv->eee_ctrl_timer); |
| @@ -300,13 +315,13 @@ bool stmmac_eee_init(struct stmmac_priv *priv) | |||
| 300 | 315 | ||
| 301 | priv->hw->mac->set_eee_timer(priv->ioaddr, | 316 | priv->hw->mac->set_eee_timer(priv->ioaddr, |
| 302 | STMMAC_DEFAULT_LIT_LS, | 317 | STMMAC_DEFAULT_LIT_LS, |
| 303 | priv->tx_lpi_timer); | 318 | tx_lpi_timer); |
| 304 | } else | 319 | } else |
| 305 | /* Set HW EEE according to the speed */ | 320 | /* Set HW EEE according to the speed */ |
| 306 | priv->hw->mac->set_eee_pls(priv->ioaddr, | 321 | priv->hw->mac->set_eee_pls(priv->ioaddr, |
| 307 | priv->phydev->link); | 322 | priv->phydev->link); |
| 308 | 323 | ||
| 309 | pr_info("stmmac: Energy-Efficient Ethernet initialized\n"); | 324 | pr_debug("stmmac: Energy-Efficient Ethernet initialized\n"); |
| 310 | 325 | ||
| 311 | ret = true; | 326 | ret = true; |
| 312 | } | 327 | } |
| @@ -886,10 +901,10 @@ static int stmmac_set_bfsize(int mtu, int bufsize) | |||
| 886 | ret = BUF_SIZE_8KiB; | 901 | ret = BUF_SIZE_8KiB; |
| 887 | else if (mtu >= BUF_SIZE_2KiB) | 902 | else if (mtu >= BUF_SIZE_2KiB) |
| 888 | ret = BUF_SIZE_4KiB; | 903 | ret = BUF_SIZE_4KiB; |
| 889 | else if (mtu >= DMA_BUFFER_SIZE) | 904 | else if (mtu > DEFAULT_BUFSIZE) |
| 890 | ret = BUF_SIZE_2KiB; | 905 | ret = BUF_SIZE_2KiB; |
| 891 | else | 906 | else |
| 892 | ret = DMA_BUFFER_SIZE; | 907 | ret = DEFAULT_BUFSIZE; |
| 893 | 908 | ||
| 894 | return ret; | 909 | return ret; |
| 895 | } | 910 | } |
| @@ -951,9 +966,9 @@ static int stmmac_init_rx_buffers(struct stmmac_priv *priv, struct dma_desc *p, | |||
| 951 | 966 | ||
| 952 | p->des2 = priv->rx_skbuff_dma[i]; | 967 | p->des2 = priv->rx_skbuff_dma[i]; |
| 953 | 968 | ||
| 954 | if ((priv->mode == STMMAC_RING_MODE) && | 969 | if ((priv->hw->mode->init_desc3) && |
| 955 | (priv->dma_buf_sz == BUF_SIZE_16KiB)) | 970 | (priv->dma_buf_sz == BUF_SIZE_16KiB)) |
| 956 | priv->hw->ring->init_desc3(p); | 971 | priv->hw->mode->init_desc3(p); |
| 957 | 972 | ||
| 958 | return 0; | 973 | return 0; |
| 959 | } | 974 | } |
| @@ -984,11 +999,8 @@ static int init_dma_desc_rings(struct net_device *dev) | |||
| 984 | unsigned int bfsize = 0; | 999 | unsigned int bfsize = 0; |
| 985 | int ret = -ENOMEM; | 1000 | int ret = -ENOMEM; |
| 986 | 1001 | ||
| 987 | /* Set the max buffer size according to the DESC mode | 1002 | if (priv->hw->mode->set_16kib_bfsize) |
| 988 | * and the MTU. Note that RING mode allows 16KiB bsize. | 1003 | bfsize = priv->hw->mode->set_16kib_bfsize(dev->mtu); |
| 989 | */ | ||
| 990 | if (priv->mode == STMMAC_RING_MODE) | ||
| 991 | bfsize = priv->hw->ring->set_16kib_bfsize(dev->mtu); | ||
| 992 | 1004 | ||
| 993 | if (bfsize < BUF_SIZE_16KiB) | 1005 | if (bfsize < BUF_SIZE_16KiB) |
| 994 | bfsize = stmmac_set_bfsize(dev->mtu, priv->dma_buf_sz); | 1006 | bfsize = stmmac_set_bfsize(dev->mtu, priv->dma_buf_sz); |
| @@ -1029,15 +1041,15 @@ static int init_dma_desc_rings(struct net_device *dev) | |||
| 1029 | /* Setup the chained descriptor addresses */ | 1041 | /* Setup the chained descriptor addresses */ |
| 1030 | if (priv->mode == STMMAC_CHAIN_MODE) { | 1042 | if (priv->mode == STMMAC_CHAIN_MODE) { |
| 1031 | if (priv->extend_desc) { | 1043 | if (priv->extend_desc) { |
| 1032 | priv->hw->chain->init(priv->dma_erx, priv->dma_rx_phy, | 1044 | priv->hw->mode->init(priv->dma_erx, priv->dma_rx_phy, |
| 1033 | rxsize, 1); | 1045 | rxsize, 1); |
| 1034 | priv->hw->chain->init(priv->dma_etx, priv->dma_tx_phy, | 1046 | priv->hw->mode->init(priv->dma_etx, priv->dma_tx_phy, |
| 1035 | txsize, 1); | 1047 | txsize, 1); |
| 1036 | } else { | 1048 | } else { |
| 1037 | priv->hw->chain->init(priv->dma_rx, priv->dma_rx_phy, | 1049 | priv->hw->mode->init(priv->dma_rx, priv->dma_rx_phy, |
| 1038 | rxsize, 0); | 1050 | rxsize, 0); |
| 1039 | priv->hw->chain->init(priv->dma_tx, priv->dma_tx_phy, | 1051 | priv->hw->mode->init(priv->dma_tx, priv->dma_tx_phy, |
| 1040 | txsize, 0); | 1052 | txsize, 0); |
| 1041 | } | 1053 | } |
| 1042 | } | 1054 | } |
| 1043 | 1055 | ||
| @@ -1288,7 +1300,7 @@ static void stmmac_tx_clean(struct stmmac_priv *priv) | |||
| 1288 | DMA_TO_DEVICE); | 1300 | DMA_TO_DEVICE); |
| 1289 | priv->tx_skbuff_dma[entry] = 0; | 1301 | priv->tx_skbuff_dma[entry] = 0; |
| 1290 | } | 1302 | } |
| 1291 | priv->hw->ring->clean_desc3(priv, p); | 1303 | priv->hw->mode->clean_desc3(priv, p); |
| 1292 | 1304 | ||
| 1293 | if (likely(skb != NULL)) { | 1305 | if (likely(skb != NULL)) { |
| 1294 | dev_kfree_skb(skb); | 1306 | dev_kfree_skb(skb); |
| @@ -1844,6 +1856,7 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 1844 | int nfrags = skb_shinfo(skb)->nr_frags; | 1856 | int nfrags = skb_shinfo(skb)->nr_frags; |
| 1845 | struct dma_desc *desc, *first; | 1857 | struct dma_desc *desc, *first; |
| 1846 | unsigned int nopaged_len = skb_headlen(skb); | 1858 | unsigned int nopaged_len = skb_headlen(skb); |
| 1859 | unsigned int enh_desc = priv->plat->enh_desc; | ||
| 1847 | 1860 | ||
| 1848 | if (unlikely(stmmac_tx_avail(priv) < nfrags + 1)) { | 1861 | if (unlikely(stmmac_tx_avail(priv) < nfrags + 1)) { |
| 1849 | if (!netif_queue_stopped(dev)) { | 1862 | if (!netif_queue_stopped(dev)) { |
| @@ -1871,27 +1884,19 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 1871 | first = desc; | 1884 | first = desc; |
| 1872 | 1885 | ||
| 1873 | /* To program the descriptors according to the size of the frame */ | 1886 | /* To program the descriptors according to the size of the frame */ |
| 1874 | if (priv->mode == STMMAC_RING_MODE) { | 1887 | if (enh_desc) |
| 1875 | is_jumbo = priv->hw->ring->is_jumbo_frm(skb->len, | 1888 | is_jumbo = priv->hw->mode->is_jumbo_frm(skb->len, enh_desc); |
| 1876 | priv->plat->enh_desc); | 1889 | |
| 1877 | if (unlikely(is_jumbo)) | ||
| 1878 | entry = priv->hw->ring->jumbo_frm(priv, skb, | ||
| 1879 | csum_insertion); | ||
| 1880 | } else { | ||
| 1881 | is_jumbo = priv->hw->chain->is_jumbo_frm(skb->len, | ||
| 1882 | priv->plat->enh_desc); | ||
| 1883 | if (unlikely(is_jumbo)) | ||
| 1884 | entry = priv->hw->chain->jumbo_frm(priv, skb, | ||
| 1885 | csum_insertion); | ||
| 1886 | } | ||
| 1887 | if (likely(!is_jumbo)) { | 1890 | if (likely(!is_jumbo)) { |
| 1888 | desc->des2 = dma_map_single(priv->device, skb->data, | 1891 | desc->des2 = dma_map_single(priv->device, skb->data, |
| 1889 | nopaged_len, DMA_TO_DEVICE); | 1892 | nopaged_len, DMA_TO_DEVICE); |
| 1890 | priv->tx_skbuff_dma[entry] = desc->des2; | 1893 | priv->tx_skbuff_dma[entry] = desc->des2; |
| 1891 | priv->hw->desc->prepare_tx_desc(desc, 1, nopaged_len, | 1894 | priv->hw->desc->prepare_tx_desc(desc, 1, nopaged_len, |
| 1892 | csum_insertion, priv->mode); | 1895 | csum_insertion, priv->mode); |
| 1893 | } else | 1896 | } else { |
| 1894 | desc = first; | 1897 | desc = first; |
| 1898 | entry = priv->hw->mode->jumbo_frm(priv, skb, csum_insertion); | ||
| 1899 | } | ||
| 1895 | 1900 | ||
| 1896 | for (i = 0; i < nfrags; i++) { | 1901 | for (i = 0; i < nfrags; i++) { |
| 1897 | const skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; | 1902 | const skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; |
| @@ -2029,7 +2034,7 @@ static inline void stmmac_rx_refill(struct stmmac_priv *priv) | |||
| 2029 | 2034 | ||
| 2030 | p->des2 = priv->rx_skbuff_dma[entry]; | 2035 | p->des2 = priv->rx_skbuff_dma[entry]; |
| 2031 | 2036 | ||
| 2032 | priv->hw->ring->refill_desc3(priv, p); | 2037 | priv->hw->mode->refill_desc3(priv, p); |
| 2033 | 2038 | ||
| 2034 | if (netif_msg_rx_status(priv)) | 2039 | if (netif_msg_rx_status(priv)) |
| 2035 | pr_debug("\trefill entry #%d\n", entry); | 2040 | pr_debug("\trefill entry #%d\n", entry); |
| @@ -2633,11 +2638,11 @@ static int stmmac_hw_init(struct stmmac_priv *priv) | |||
| 2633 | 2638 | ||
| 2634 | /* To use the chained or ring mode */ | 2639 | /* To use the chained or ring mode */ |
| 2635 | if (chain_mode) { | 2640 | if (chain_mode) { |
| 2636 | priv->hw->chain = &chain_mode_ops; | 2641 | priv->hw->mode = &chain_mode_ops; |
| 2637 | pr_info(" Chain mode enabled\n"); | 2642 | pr_info(" Chain mode enabled\n"); |
| 2638 | priv->mode = STMMAC_CHAIN_MODE; | 2643 | priv->mode = STMMAC_CHAIN_MODE; |
| 2639 | } else { | 2644 | } else { |
| 2640 | priv->hw->ring = &ring_mode_ops; | 2645 | priv->hw->mode = &ring_mode_ops; |
| 2641 | pr_info(" Ring mode enabled\n"); | 2646 | pr_info(" Ring mode enabled\n"); |
| 2642 | priv->mode = STMMAC_RING_MODE; | 2647 | priv->mode = STMMAC_RING_MODE; |
| 2643 | } | 2648 | } |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c index c61bc72b8e90..8fb32a80f1c1 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | |||
| @@ -36,7 +36,7 @@ static const struct of_device_id stmmac_dt_ids[] = { | |||
| 36 | #ifdef CONFIG_DWMAC_STI | 36 | #ifdef CONFIG_DWMAC_STI |
| 37 | { .compatible = "st,stih415-dwmac", .data = &sti_gmac_data}, | 37 | { .compatible = "st,stih415-dwmac", .data = &sti_gmac_data}, |
| 38 | { .compatible = "st,stih416-dwmac", .data = &sti_gmac_data}, | 38 | { .compatible = "st,stih416-dwmac", .data = &sti_gmac_data}, |
| 39 | { .compatible = "st,stih127-dwmac", .data = &sti_gmac_data}, | 39 | { .compatible = "st,stid127-dwmac", .data = &sti_gmac_data}, |
| 40 | #endif | 40 | #endif |
| 41 | /* SoC specific glue layers should come before generic bindings */ | 41 | /* SoC specific glue layers should come before generic bindings */ |
| 42 | { .compatible = "st,spear600-gmac"}, | 42 | { .compatible = "st,spear600-gmac"}, |
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index 7141a1937360..d6fce9750b95 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c | |||
| @@ -442,6 +442,8 @@ static int netvsc_probe(struct hv_device *dev, | |||
| 442 | if (!net) | 442 | if (!net) |
| 443 | return -ENOMEM; | 443 | return -ENOMEM; |
| 444 | 444 | ||
| 445 | netif_carrier_off(net); | ||
| 446 | |||
| 445 | net_device_ctx = netdev_priv(net); | 447 | net_device_ctx = netdev_priv(net); |
| 446 | net_device_ctx->device_ctx = dev; | 448 | net_device_ctx->device_ctx = dev; |
| 447 | hv_set_drvdata(dev, net); | 449 | hv_set_drvdata(dev, net); |
| @@ -473,6 +475,8 @@ static int netvsc_probe(struct hv_device *dev, | |||
| 473 | pr_err("Unable to register netdev.\n"); | 475 | pr_err("Unable to register netdev.\n"); |
| 474 | rndis_filter_device_remove(dev); | 476 | rndis_filter_device_remove(dev); |
| 475 | free_netdev(net); | 477 | free_netdev(net); |
| 478 | } else { | ||
| 479 | schedule_delayed_work(&net_device_ctx->dwork, 0); | ||
| 476 | } | 480 | } |
| 477 | 481 | ||
| 478 | return ret; | 482 | return ret; |
diff --git a/drivers/net/hyperv/rndis_filter.c b/drivers/net/hyperv/rndis_filter.c index 1084e5de3ceb..b54fd257652b 100644 --- a/drivers/net/hyperv/rndis_filter.c +++ b/drivers/net/hyperv/rndis_filter.c | |||
| @@ -243,6 +243,22 @@ static int rndis_filter_send_request(struct rndis_device *dev, | |||
| 243 | return ret; | 243 | return ret; |
| 244 | } | 244 | } |
| 245 | 245 | ||
| 246 | static void rndis_set_link_state(struct rndis_device *rdev, | ||
| 247 | struct rndis_request *request) | ||
| 248 | { | ||
| 249 | u32 link_status; | ||
| 250 | struct rndis_query_complete *query_complete; | ||
| 251 | |||
| 252 | query_complete = &request->response_msg.msg.query_complete; | ||
| 253 | |||
| 254 | if (query_complete->status == RNDIS_STATUS_SUCCESS && | ||
| 255 | query_complete->info_buflen == sizeof(u32)) { | ||
| 256 | memcpy(&link_status, (void *)((unsigned long)query_complete + | ||
| 257 | query_complete->info_buf_offset), sizeof(u32)); | ||
| 258 | rdev->link_state = link_status != 0; | ||
| 259 | } | ||
| 260 | } | ||
| 261 | |||
| 246 | static void rndis_filter_receive_response(struct rndis_device *dev, | 262 | static void rndis_filter_receive_response(struct rndis_device *dev, |
| 247 | struct rndis_message *resp) | 263 | struct rndis_message *resp) |
| 248 | { | 264 | { |
| @@ -272,6 +288,10 @@ static void rndis_filter_receive_response(struct rndis_device *dev, | |||
| 272 | sizeof(struct rndis_message) + RNDIS_EXT_LEN) { | 288 | sizeof(struct rndis_message) + RNDIS_EXT_LEN) { |
| 273 | memcpy(&request->response_msg, resp, | 289 | memcpy(&request->response_msg, resp, |
| 274 | resp->msg_len); | 290 | resp->msg_len); |
| 291 | if (request->request_msg.ndis_msg_type == | ||
| 292 | RNDIS_MSG_QUERY && request->request_msg.msg. | ||
| 293 | query_req.oid == RNDIS_OID_GEN_MEDIA_CONNECT_STATUS) | ||
| 294 | rndis_set_link_state(dev, request); | ||
| 275 | } else { | 295 | } else { |
| 276 | netdev_err(ndev, | 296 | netdev_err(ndev, |
| 277 | "rndis response buffer overflow " | 297 | "rndis response buffer overflow " |
| @@ -620,7 +640,6 @@ static int rndis_filter_query_device_link_status(struct rndis_device *dev) | |||
| 620 | ret = rndis_filter_query_device(dev, | 640 | ret = rndis_filter_query_device(dev, |
| 621 | RNDIS_OID_GEN_MEDIA_CONNECT_STATUS, | 641 | RNDIS_OID_GEN_MEDIA_CONNECT_STATUS, |
| 622 | &link_status, &size); | 642 | &link_status, &size); |
| 623 | dev->link_state = (link_status != 0) ? true : false; | ||
| 624 | 643 | ||
| 625 | return ret; | 644 | return ret; |
| 626 | } | 645 | } |
diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c index ab31544bc254..a30258aad139 100644 --- a/drivers/net/ieee802154/at86rf230.c +++ b/drivers/net/ieee802154/at86rf230.c | |||
| @@ -546,12 +546,12 @@ at86rf230_xmit(struct ieee802154_dev *dev, struct sk_buff *skb) | |||
| 546 | int rc; | 546 | int rc; |
| 547 | unsigned long flags; | 547 | unsigned long flags; |
| 548 | 548 | ||
| 549 | spin_lock(&lp->lock); | 549 | spin_lock_irqsave(&lp->lock, flags); |
| 550 | if (lp->irq_busy) { | 550 | if (lp->irq_busy) { |
| 551 | spin_unlock(&lp->lock); | 551 | spin_unlock_irqrestore(&lp->lock, flags); |
| 552 | return -EBUSY; | 552 | return -EBUSY; |
| 553 | } | 553 | } |
| 554 | spin_unlock(&lp->lock); | 554 | spin_unlock_irqrestore(&lp->lock, flags); |
| 555 | 555 | ||
| 556 | might_sleep(); | 556 | might_sleep(); |
| 557 | 557 | ||
| @@ -725,10 +725,11 @@ static void at86rf230_irqwork_level(struct work_struct *work) | |||
| 725 | static irqreturn_t at86rf230_isr(int irq, void *data) | 725 | static irqreturn_t at86rf230_isr(int irq, void *data) |
| 726 | { | 726 | { |
| 727 | struct at86rf230_local *lp = data; | 727 | struct at86rf230_local *lp = data; |
| 728 | unsigned long flags; | ||
| 728 | 729 | ||
| 729 | spin_lock(&lp->lock); | 730 | spin_lock_irqsave(&lp->lock, flags); |
| 730 | lp->irq_busy = 1; | 731 | lp->irq_busy = 1; |
| 731 | spin_unlock(&lp->lock); | 732 | spin_unlock_irqrestore(&lp->lock, flags); |
| 732 | 733 | ||
| 733 | schedule_work(&lp->irqwork); | 734 | schedule_work(&lp->irqwork); |
| 734 | 735 | ||
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index 19c9eca0ef26..76d96b9ebcdb 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c | |||
| @@ -164,9 +164,9 @@ static const struct phy_setting settings[] = { | |||
| 164 | * of that setting. Returns the index of the last setting if | 164 | * of that setting. Returns the index of the last setting if |
| 165 | * none of the others match. | 165 | * none of the others match. |
| 166 | */ | 166 | */ |
| 167 | static inline int phy_find_setting(int speed, int duplex) | 167 | static inline unsigned int phy_find_setting(int speed, int duplex) |
| 168 | { | 168 | { |
| 169 | int idx = 0; | 169 | unsigned int idx = 0; |
| 170 | 170 | ||
| 171 | while (idx < ARRAY_SIZE(settings) && | 171 | while (idx < ARRAY_SIZE(settings) && |
| 172 | (settings[idx].speed != speed || settings[idx].duplex != duplex)) | 172 | (settings[idx].speed != speed || settings[idx].duplex != duplex)) |
| @@ -185,7 +185,7 @@ static inline int phy_find_setting(int speed, int duplex) | |||
| 185 | * the mask in features. Returns the index of the last setting | 185 | * the mask in features. Returns the index of the last setting |
| 186 | * if nothing else matches. | 186 | * if nothing else matches. |
| 187 | */ | 187 | */ |
| 188 | static inline int phy_find_valid(int idx, u32 features) | 188 | static inline unsigned int phy_find_valid(unsigned int idx, u32 features) |
| 189 | { | 189 | { |
| 190 | while (idx < MAX_NUM_SETTINGS && !(settings[idx].setting & features)) | 190 | while (idx < MAX_NUM_SETTINGS && !(settings[idx].setting & features)) |
| 191 | idx++; | 191 | idx++; |
| @@ -204,7 +204,7 @@ static inline int phy_find_valid(int idx, u32 features) | |||
| 204 | static void phy_sanitize_settings(struct phy_device *phydev) | 204 | static void phy_sanitize_settings(struct phy_device *phydev) |
| 205 | { | 205 | { |
| 206 | u32 features = phydev->supported; | 206 | u32 features = phydev->supported; |
| 207 | int idx; | 207 | unsigned int idx; |
| 208 | 208 | ||
| 209 | /* Sanitize settings based on PHY capabilities */ | 209 | /* Sanitize settings based on PHY capabilities */ |
| 210 | if ((features & SUPPORTED_Autoneg) == 0) | 210 | if ((features & SUPPORTED_Autoneg) == 0) |
| @@ -954,7 +954,8 @@ int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable) | |||
| 954 | (phydev->interface == PHY_INTERFACE_MODE_RGMII))) { | 954 | (phydev->interface == PHY_INTERFACE_MODE_RGMII))) { |
| 955 | int eee_lp, eee_cap, eee_adv; | 955 | int eee_lp, eee_cap, eee_adv; |
| 956 | u32 lp, cap, adv; | 956 | u32 lp, cap, adv; |
| 957 | int idx, status; | 957 | int status; |
| 958 | unsigned int idx; | ||
| 958 | 959 | ||
| 959 | /* Read phy status to properly get the right settings */ | 960 | /* Read phy status to properly get the right settings */ |
| 960 | status = phy_read_status(phydev); | 961 | status = phy_read_status(phydev); |
diff --git a/drivers/net/usb/Makefile b/drivers/net/usb/Makefile index 433f0a00c683..e2797f1e1b31 100644 --- a/drivers/net/usb/Makefile +++ b/drivers/net/usb/Makefile | |||
| @@ -11,7 +11,7 @@ obj-$(CONFIG_USB_HSO) += hso.o | |||
| 11 | obj-$(CONFIG_USB_NET_AX8817X) += asix.o | 11 | obj-$(CONFIG_USB_NET_AX8817X) += asix.o |
| 12 | asix-y := asix_devices.o asix_common.o ax88172a.o | 12 | asix-y := asix_devices.o asix_common.o ax88172a.o |
| 13 | obj-$(CONFIG_USB_NET_AX88179_178A) += ax88179_178a.o | 13 | obj-$(CONFIG_USB_NET_AX88179_178A) += ax88179_178a.o |
| 14 | obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o r815x.o | 14 | obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o |
| 15 | obj-$(CONFIG_USB_NET_CDC_EEM) += cdc_eem.o | 15 | obj-$(CONFIG_USB_NET_CDC_EEM) += cdc_eem.o |
| 16 | obj-$(CONFIG_USB_NET_DM9601) += dm9601.o | 16 | obj-$(CONFIG_USB_NET_DM9601) += dm9601.o |
| 17 | obj-$(CONFIG_USB_NET_SR9700) += sr9700.o | 17 | obj-$(CONFIG_USB_NET_SR9700) += sr9700.o |
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index 42e176912c8e..bd363b27e854 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c | |||
| @@ -652,6 +652,13 @@ static const struct usb_device_id products[] = { | |||
| 652 | .driver_info = 0, | 652 | .driver_info = 0, |
| 653 | }, | 653 | }, |
| 654 | 654 | ||
| 655 | /* Samsung USB Ethernet Adapters */ | ||
| 656 | { | ||
| 657 | USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, 0xa101, USB_CLASS_COMM, | ||
| 658 | USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), | ||
| 659 | .driver_info = 0, | ||
| 660 | }, | ||
| 661 | |||
| 655 | /* WHITELIST!!! | 662 | /* WHITELIST!!! |
| 656 | * | 663 | * |
| 657 | * CDC Ether uses two interfaces, not necessarily consecutive. | 664 | * CDC Ether uses two interfaces, not necessarily consecutive. |
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index d89dbe395ad2..adb12f349a61 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c | |||
| @@ -449,9 +449,6 @@ enum rtl8152_flags { | |||
| 449 | #define MCU_TYPE_PLA 0x0100 | 449 | #define MCU_TYPE_PLA 0x0100 |
| 450 | #define MCU_TYPE_USB 0x0000 | 450 | #define MCU_TYPE_USB 0x0000 |
| 451 | 451 | ||
| 452 | #define REALTEK_USB_DEVICE(vend, prod) \ | ||
| 453 | USB_DEVICE_INTERFACE_CLASS(vend, prod, USB_CLASS_VENDOR_SPEC) | ||
| 454 | |||
| 455 | struct rx_desc { | 452 | struct rx_desc { |
| 456 | __le32 opts1; | 453 | __le32 opts1; |
| 457 | #define RX_LEN_MASK 0x7fff | 454 | #define RX_LEN_MASK 0x7fff |
| @@ -2739,6 +2736,12 @@ static int rtl8152_probe(struct usb_interface *intf, | |||
| 2739 | struct net_device *netdev; | 2736 | struct net_device *netdev; |
| 2740 | int ret; | 2737 | int ret; |
| 2741 | 2738 | ||
| 2739 | if (udev->actconfig->desc.bConfigurationValue != 1) { | ||
| 2740 | usb_driver_set_configuration(udev, 1); | ||
| 2741 | return -ENODEV; | ||
| 2742 | } | ||
| 2743 | |||
| 2744 | usb_reset_device(udev); | ||
| 2742 | netdev = alloc_etherdev(sizeof(struct r8152)); | 2745 | netdev = alloc_etherdev(sizeof(struct r8152)); |
| 2743 | if (!netdev) { | 2746 | if (!netdev) { |
| 2744 | dev_err(&intf->dev, "Out of memory\n"); | 2747 | dev_err(&intf->dev, "Out of memory\n"); |
| @@ -2819,9 +2822,9 @@ static void rtl8152_disconnect(struct usb_interface *intf) | |||
| 2819 | 2822 | ||
| 2820 | /* table of devices that work with this driver */ | 2823 | /* table of devices that work with this driver */ |
| 2821 | static struct usb_device_id rtl8152_table[] = { | 2824 | static struct usb_device_id rtl8152_table[] = { |
| 2822 | {REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, PRODUCT_ID_RTL8152)}, | 2825 | {USB_DEVICE(VENDOR_ID_REALTEK, PRODUCT_ID_RTL8152)}, |
| 2823 | {REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, PRODUCT_ID_RTL8153)}, | 2826 | {USB_DEVICE(VENDOR_ID_REALTEK, PRODUCT_ID_RTL8153)}, |
| 2824 | {REALTEK_USB_DEVICE(VENDOR_ID_SAMSUNG, PRODUCT_ID_SAMSUNG)}, | 2827 | {USB_DEVICE(VENDOR_ID_SAMSUNG, PRODUCT_ID_SAMSUNG)}, |
| 2825 | {} | 2828 | {} |
| 2826 | }; | 2829 | }; |
| 2827 | 2830 | ||
diff --git a/drivers/net/usb/r815x.c b/drivers/net/usb/r815x.c deleted file mode 100644 index f0a8791b7636..000000000000 --- a/drivers/net/usb/r815x.c +++ /dev/null | |||
| @@ -1,248 +0,0 @@ | |||
| 1 | #include <linux/module.h> | ||
| 2 | #include <linux/netdevice.h> | ||
| 3 | #include <linux/mii.h> | ||
| 4 | #include <linux/usb.h> | ||
| 5 | #include <linux/usb/cdc.h> | ||
| 6 | #include <linux/usb/usbnet.h> | ||
| 7 | |||
| 8 | #define RTL815x_REQT_READ 0xc0 | ||
| 9 | #define RTL815x_REQT_WRITE 0x40 | ||
| 10 | #define RTL815x_REQ_GET_REGS 0x05 | ||
| 11 | #define RTL815x_REQ_SET_REGS 0x05 | ||
| 12 | |||
| 13 | #define MCU_TYPE_PLA 0x0100 | ||
| 14 | #define OCP_BASE 0xe86c | ||
| 15 | #define BASE_MII 0xa400 | ||
| 16 | |||
| 17 | #define BYTE_EN_DWORD 0xff | ||
| 18 | #define BYTE_EN_WORD 0x33 | ||
| 19 | #define BYTE_EN_BYTE 0x11 | ||
| 20 | |||
| 21 | #define R815x_PHY_ID 32 | ||
| 22 | #define REALTEK_VENDOR_ID 0x0bda | ||
| 23 | |||
| 24 | |||
| 25 | static int pla_read_word(struct usb_device *udev, u16 index) | ||
| 26 | { | ||
| 27 | int ret; | ||
| 28 | u8 shift = index & 2; | ||
| 29 | __le32 *tmp; | ||
| 30 | |||
| 31 | tmp = kmalloc(sizeof(*tmp), GFP_KERNEL); | ||
| 32 | if (!tmp) | ||
| 33 | return -ENOMEM; | ||
| 34 | |||
| 35 | index &= ~3; | ||
| 36 | |||
| 37 | ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), | ||
| 38 | RTL815x_REQ_GET_REGS, RTL815x_REQT_READ, | ||
| 39 | index, MCU_TYPE_PLA, tmp, sizeof(*tmp), 500); | ||
| 40 | if (ret < 0) | ||
| 41 | goto out2; | ||
| 42 | |||
| 43 | ret = __le32_to_cpu(*tmp); | ||
| 44 | ret >>= (shift * 8); | ||
| 45 | ret &= 0xffff; | ||
| 46 | |||
| 47 | out2: | ||
| 48 | kfree(tmp); | ||
| 49 | return ret; | ||
| 50 | } | ||
| 51 | |||
| 52 | static int pla_write_word(struct usb_device *udev, u16 index, u32 data) | ||
| 53 | { | ||
| 54 | __le32 *tmp; | ||
| 55 | u32 mask = 0xffff; | ||
| 56 | u16 byen = BYTE_EN_WORD; | ||
| 57 | u8 shift = index & 2; | ||
| 58 | int ret; | ||
| 59 | |||
| 60 | tmp = kmalloc(sizeof(*tmp), GFP_KERNEL); | ||
| 61 | if (!tmp) | ||
| 62 | return -ENOMEM; | ||
| 63 | |||
| 64 | data &= mask; | ||
| 65 | |||
| 66 | if (shift) { | ||
| 67 | byen <<= shift; | ||
| 68 | mask <<= (shift * 8); | ||
| 69 | data <<= (shift * 8); | ||
| 70 | index &= ~3; | ||
| 71 | } | ||
| 72 | |||
| 73 | ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), | ||
| 74 | RTL815x_REQ_GET_REGS, RTL815x_REQT_READ, | ||
| 75 | index, MCU_TYPE_PLA, tmp, sizeof(*tmp), 500); | ||
| 76 | if (ret < 0) | ||
| 77 | goto out3; | ||
| 78 | |||
| 79 | data |= __le32_to_cpu(*tmp) & ~mask; | ||
| 80 | *tmp = __cpu_to_le32(data); | ||
| 81 | |||
| 82 | ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | ||
| 83 | RTL815x_REQ_SET_REGS, RTL815x_REQT_WRITE, | ||
| 84 | index, MCU_TYPE_PLA | byen, tmp, sizeof(*tmp), | ||
| 85 | 500); | ||
| 86 | |||
| 87 | out3: | ||
| 88 | kfree(tmp); | ||
| 89 | return ret; | ||
| 90 | } | ||
| 91 | |||
| 92 | static int ocp_reg_read(struct usbnet *dev, u16 addr) | ||
| 93 | { | ||
| 94 | u16 ocp_base, ocp_index; | ||
| 95 | int ret; | ||
| 96 | |||
| 97 | ocp_base = addr & 0xf000; | ||
| 98 | ret = pla_write_word(dev->udev, OCP_BASE, ocp_base); | ||
| 99 | if (ret < 0) | ||
| 100 | goto out; | ||
| 101 | |||
| 102 | ocp_index = (addr & 0x0fff) | 0xb000; | ||
| 103 | ret = pla_read_word(dev->udev, ocp_index); | ||
| 104 | |||
| 105 | out: | ||
| 106 | return ret; | ||
| 107 | } | ||
| 108 | |||
| 109 | static int ocp_reg_write(struct usbnet *dev, u16 addr, u16 data) | ||
| 110 | { | ||
| 111 | u16 ocp_base, ocp_index; | ||
| 112 | int ret; | ||
| 113 | |||
| 114 | ocp_base = addr & 0xf000; | ||
| 115 | ret = pla_write_word(dev->udev, OCP_BASE, ocp_base); | ||
| 116 | if (ret < 0) | ||
| 117 | goto out1; | ||
| 118 | |||
| 119 | ocp_index = (addr & 0x0fff) | 0xb000; | ||
| 120 | ret = pla_write_word(dev->udev, ocp_index, data); | ||
| 121 | |||
| 122 | out1: | ||
| 123 | return ret; | ||
| 124 | } | ||
| 125 | |||
| 126 | static int r815x_mdio_read(struct net_device *netdev, int phy_id, int reg) | ||
| 127 | { | ||
| 128 | struct usbnet *dev = netdev_priv(netdev); | ||
| 129 | int ret; | ||
| 130 | |||
| 131 | if (phy_id != R815x_PHY_ID) | ||
| 132 | return -EINVAL; | ||
| 133 | |||
| 134 | if (usb_autopm_get_interface(dev->intf) < 0) | ||
| 135 | return -ENODEV; | ||
| 136 | |||
| 137 | ret = ocp_reg_read(dev, BASE_MII + reg * 2); | ||
| 138 | |||
| 139 | usb_autopm_put_interface(dev->intf); | ||
| 140 | return ret; | ||
| 141 | } | ||
| 142 | |||
| 143 | static | ||
| 144 | void r815x_mdio_write(struct net_device *netdev, int phy_id, int reg, int val) | ||
| 145 | { | ||
| 146 | struct usbnet *dev = netdev_priv(netdev); | ||
| 147 | |||
| 148 | if (phy_id != R815x_PHY_ID) | ||
| 149 | return; | ||
| 150 | |||
| 151 | if (usb_autopm_get_interface(dev->intf) < 0) | ||
| 152 | return; | ||
| 153 | |||
| 154 | ocp_reg_write(dev, BASE_MII + reg * 2, val); | ||
| 155 | |||
| 156 | usb_autopm_put_interface(dev->intf); | ||
| 157 | } | ||
| 158 | |||
| 159 | static int r8153_bind(struct usbnet *dev, struct usb_interface *intf) | ||
| 160 | { | ||
| 161 | int status; | ||
| 162 | |||
| 163 | status = usbnet_cdc_bind(dev, intf); | ||
| 164 | if (status < 0) | ||
| 165 | return status; | ||
| 166 | |||
| 167 | dev->mii.dev = dev->net; | ||
| 168 | dev->mii.mdio_read = r815x_mdio_read; | ||
| 169 | dev->mii.mdio_write = r815x_mdio_write; | ||
| 170 | dev->mii.phy_id_mask = 0x3f; | ||
| 171 | dev->mii.reg_num_mask = 0x1f; | ||
| 172 | dev->mii.phy_id = R815x_PHY_ID; | ||
| 173 | dev->mii.supports_gmii = 1; | ||
| 174 | |||
| 175 | return status; | ||
| 176 | } | ||
| 177 | |||
| 178 | static int r8152_bind(struct usbnet *dev, struct usb_interface *intf) | ||
| 179 | { | ||
| 180 | int status; | ||
| 181 | |||
| 182 | status = usbnet_cdc_bind(dev, intf); | ||
| 183 | if (status < 0) | ||
| 184 | return status; | ||
| 185 | |||
| 186 | dev->mii.dev = dev->net; | ||
| 187 | dev->mii.mdio_read = r815x_mdio_read; | ||
| 188 | dev->mii.mdio_write = r815x_mdio_write; | ||
| 189 | dev->mii.phy_id_mask = 0x3f; | ||
| 190 | dev->mii.reg_num_mask = 0x1f; | ||
| 191 | dev->mii.phy_id = R815x_PHY_ID; | ||
| 192 | dev->mii.supports_gmii = 0; | ||
| 193 | |||
| 194 | return status; | ||
| 195 | } | ||
| 196 | |||
| 197 | static const struct driver_info r8152_info = { | ||
| 198 | .description = "RTL8152 ECM Device", | ||
| 199 | .flags = FLAG_ETHER | FLAG_POINTTOPOINT, | ||
| 200 | .bind = r8152_bind, | ||
| 201 | .unbind = usbnet_cdc_unbind, | ||
| 202 | .status = usbnet_cdc_status, | ||
| 203 | .manage_power = usbnet_manage_power, | ||
| 204 | }; | ||
| 205 | |||
| 206 | static const struct driver_info r8153_info = { | ||
| 207 | .description = "RTL8153 ECM Device", | ||
| 208 | .flags = FLAG_ETHER | FLAG_POINTTOPOINT, | ||
| 209 | .bind = r8153_bind, | ||
| 210 | .unbind = usbnet_cdc_unbind, | ||
| 211 | .status = usbnet_cdc_status, | ||
| 212 | .manage_power = usbnet_manage_power, | ||
| 213 | }; | ||
| 214 | |||
| 215 | static const struct usb_device_id products[] = { | ||
| 216 | { | ||
| 217 | USB_DEVICE_AND_INTERFACE_INFO(REALTEK_VENDOR_ID, 0x8152, USB_CLASS_COMM, | ||
| 218 | USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), | ||
| 219 | .driver_info = (unsigned long) &r8152_info, | ||
| 220 | }, | ||
| 221 | |||
| 222 | { | ||
| 223 | USB_DEVICE_AND_INTERFACE_INFO(REALTEK_VENDOR_ID, 0x8153, USB_CLASS_COMM, | ||
| 224 | USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), | ||
| 225 | .driver_info = (unsigned long) &r8153_info, | ||
| 226 | }, | ||
| 227 | |||
| 228 | { }, /* END */ | ||
| 229 | }; | ||
| 230 | MODULE_DEVICE_TABLE(usb, products); | ||
| 231 | |||
| 232 | static struct usb_driver r815x_driver = { | ||
| 233 | .name = "r815x", | ||
| 234 | .id_table = products, | ||
| 235 | .probe = usbnet_probe, | ||
| 236 | .disconnect = usbnet_disconnect, | ||
| 237 | .suspend = usbnet_suspend, | ||
| 238 | .resume = usbnet_resume, | ||
| 239 | .reset_resume = usbnet_resume, | ||
| 240 | .supports_autosuspend = 1, | ||
| 241 | .disable_hub_initiated_lpm = 1, | ||
| 242 | }; | ||
| 243 | |||
| 244 | module_usb_driver(r815x_driver); | ||
| 245 | |||
| 246 | MODULE_AUTHOR("Hayes Wang"); | ||
| 247 | MODULE_DESCRIPTION("Realtek USB ECM device"); | ||
| 248 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c index 3be786faaaec..0fa3b44f7342 100644 --- a/drivers/net/vmxnet3/vmxnet3_drv.c +++ b/drivers/net/vmxnet3/vmxnet3_drv.c | |||
| @@ -1762,11 +1762,20 @@ vmxnet3_netpoll(struct net_device *netdev) | |||
| 1762 | { | 1762 | { |
| 1763 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); | 1763 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); |
| 1764 | 1764 | ||
| 1765 | if (adapter->intr.mask_mode == VMXNET3_IMM_ACTIVE) | 1765 | switch (adapter->intr.type) { |
| 1766 | vmxnet3_disable_all_intrs(adapter); | 1766 | #ifdef CONFIG_PCI_MSI |
| 1767 | 1767 | case VMXNET3_IT_MSIX: { | |
| 1768 | vmxnet3_do_poll(adapter, adapter->rx_queue[0].rx_ring[0].size); | 1768 | int i; |
| 1769 | vmxnet3_enable_all_intrs(adapter); | 1769 | for (i = 0; i < adapter->num_rx_queues; i++) |
| 1770 | vmxnet3_msix_rx(0, &adapter->rx_queue[i]); | ||
| 1771 | break; | ||
| 1772 | } | ||
| 1773 | #endif | ||
| 1774 | case VMXNET3_IT_MSI: | ||
| 1775 | default: | ||
| 1776 | vmxnet3_intr(0, adapter->netdev); | ||
| 1777 | break; | ||
| 1778 | } | ||
| 1770 | 1779 | ||
| 1771 | } | 1780 | } |
| 1772 | #endif /* CONFIG_NET_POLL_CONTROLLER */ | 1781 | #endif /* CONFIG_NET_POLL_CONTROLLER */ |
diff --git a/drivers/net/wireless/iwlwifi/mvm/bt-coex.c b/drivers/net/wireless/iwlwifi/mvm/bt-coex.c index 76cde6ce6551..18a895a949d4 100644 --- a/drivers/net/wireless/iwlwifi/mvm/bt-coex.c +++ b/drivers/net/wireless/iwlwifi/mvm/bt-coex.c | |||
| @@ -872,8 +872,11 @@ void iwl_mvm_bt_rssi_event(struct iwl_mvm *mvm, struct ieee80211_vif *vif, | |||
| 872 | 872 | ||
| 873 | lockdep_assert_held(&mvm->mutex); | 873 | lockdep_assert_held(&mvm->mutex); |
| 874 | 874 | ||
| 875 | /* Rssi update while not associated ?! */ | 875 | /* |
| 876 | if (WARN_ON_ONCE(mvmvif->ap_sta_id == IWL_MVM_STATION_COUNT)) | 876 | * Rssi update while not associated - can happen since the statistics |
| 877 | * are handled asynchronously | ||
| 878 | */ | ||
| 879 | if (mvmvif->ap_sta_id == IWL_MVM_STATION_COUNT) | ||
| 877 | return; | 880 | return; |
| 878 | 881 | ||
| 879 | /* No BT - reports should be disabled */ | 882 | /* No BT - reports should be disabled */ |
diff --git a/drivers/net/wireless/iwlwifi/pcie/drv.c b/drivers/net/wireless/iwlwifi/pcie/drv.c index f47bcbe2945a..3872ead75488 100644 --- a/drivers/net/wireless/iwlwifi/pcie/drv.c +++ b/drivers/net/wireless/iwlwifi/pcie/drv.c | |||
| @@ -359,13 +359,12 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = { | |||
| 359 | /* 7265 Series */ | 359 | /* 7265 Series */ |
| 360 | {IWL_PCI_DEVICE(0x095A, 0x5010, iwl7265_2ac_cfg)}, | 360 | {IWL_PCI_DEVICE(0x095A, 0x5010, iwl7265_2ac_cfg)}, |
| 361 | {IWL_PCI_DEVICE(0x095A, 0x5110, iwl7265_2ac_cfg)}, | 361 | {IWL_PCI_DEVICE(0x095A, 0x5110, iwl7265_2ac_cfg)}, |
| 362 | {IWL_PCI_DEVICE(0x095A, 0x5112, iwl7265_2ac_cfg)}, | ||
| 363 | {IWL_PCI_DEVICE(0x095A, 0x5100, iwl7265_2ac_cfg)}, | 362 | {IWL_PCI_DEVICE(0x095A, 0x5100, iwl7265_2ac_cfg)}, |
| 364 | {IWL_PCI_DEVICE(0x095A, 0x510A, iwl7265_2ac_cfg)}, | ||
| 365 | {IWL_PCI_DEVICE(0x095B, 0x5310, iwl7265_2ac_cfg)}, | 363 | {IWL_PCI_DEVICE(0x095B, 0x5310, iwl7265_2ac_cfg)}, |
| 366 | {IWL_PCI_DEVICE(0x095B, 0x5302, iwl7265_2ac_cfg)}, | 364 | {IWL_PCI_DEVICE(0x095B, 0x5302, iwl7265_n_cfg)}, |
| 367 | {IWL_PCI_DEVICE(0x095B, 0x5210, iwl7265_2ac_cfg)}, | 365 | {IWL_PCI_DEVICE(0x095B, 0x5210, iwl7265_2ac_cfg)}, |
| 368 | {IWL_PCI_DEVICE(0x095A, 0x5012, iwl7265_2ac_cfg)}, | 366 | {IWL_PCI_DEVICE(0x095A, 0x5012, iwl7265_2ac_cfg)}, |
| 367 | {IWL_PCI_DEVICE(0x095A, 0x5412, iwl7265_2ac_cfg)}, | ||
| 369 | {IWL_PCI_DEVICE(0x095A, 0x5410, iwl7265_2ac_cfg)}, | 368 | {IWL_PCI_DEVICE(0x095A, 0x5410, iwl7265_2ac_cfg)}, |
| 370 | {IWL_PCI_DEVICE(0x095A, 0x5400, iwl7265_2ac_cfg)}, | 369 | {IWL_PCI_DEVICE(0x095A, 0x5400, iwl7265_2ac_cfg)}, |
| 371 | {IWL_PCI_DEVICE(0x095A, 0x1010, iwl7265_2ac_cfg)}, | 370 | {IWL_PCI_DEVICE(0x095A, 0x1010, iwl7265_2ac_cfg)}, |
diff --git a/drivers/net/wireless/mwifiex/11ac.c b/drivers/net/wireless/mwifiex/11ac.c index 5e0eec4d71c7..5d9a8084665d 100644 --- a/drivers/net/wireless/mwifiex/11ac.c +++ b/drivers/net/wireless/mwifiex/11ac.c | |||
| @@ -189,8 +189,7 @@ int mwifiex_cmd_append_11ac_tlv(struct mwifiex_private *priv, | |||
| 189 | vht_cap->header.len = | 189 | vht_cap->header.len = |
| 190 | cpu_to_le16(sizeof(struct ieee80211_vht_cap)); | 190 | cpu_to_le16(sizeof(struct ieee80211_vht_cap)); |
| 191 | memcpy((u8 *)vht_cap + sizeof(struct mwifiex_ie_types_header), | 191 | memcpy((u8 *)vht_cap + sizeof(struct mwifiex_ie_types_header), |
| 192 | (u8 *)bss_desc->bcn_vht_cap + | 192 | (u8 *)bss_desc->bcn_vht_cap, |
| 193 | sizeof(struct ieee_types_header), | ||
| 194 | le16_to_cpu(vht_cap->header.len)); | 193 | le16_to_cpu(vht_cap->header.len)); |
| 195 | 194 | ||
| 196 | mwifiex_fill_vht_cap_tlv(priv, vht_cap, bss_desc->bss_band); | 195 | mwifiex_fill_vht_cap_tlv(priv, vht_cap, bss_desc->bss_band); |
diff --git a/drivers/net/wireless/mwifiex/11n.c b/drivers/net/wireless/mwifiex/11n.c index 6261f8c53d44..7db1a89fdd95 100644 --- a/drivers/net/wireless/mwifiex/11n.c +++ b/drivers/net/wireless/mwifiex/11n.c | |||
| @@ -308,8 +308,7 @@ mwifiex_cmd_append_11n_tlv(struct mwifiex_private *priv, | |||
| 308 | ht_cap->header.len = | 308 | ht_cap->header.len = |
| 309 | cpu_to_le16(sizeof(struct ieee80211_ht_cap)); | 309 | cpu_to_le16(sizeof(struct ieee80211_ht_cap)); |
| 310 | memcpy((u8 *) ht_cap + sizeof(struct mwifiex_ie_types_header), | 310 | memcpy((u8 *) ht_cap + sizeof(struct mwifiex_ie_types_header), |
| 311 | (u8 *) bss_desc->bcn_ht_cap + | 311 | (u8 *)bss_desc->bcn_ht_cap, |
| 312 | sizeof(struct ieee_types_header), | ||
| 313 | le16_to_cpu(ht_cap->header.len)); | 312 | le16_to_cpu(ht_cap->header.len)); |
| 314 | 313 | ||
| 315 | mwifiex_fill_cap_info(priv, radio_type, ht_cap); | 314 | mwifiex_fill_cap_info(priv, radio_type, ht_cap); |
diff --git a/drivers/net/wireless/mwifiex/scan.c b/drivers/net/wireless/mwifiex/scan.c index 0a8a26e10f01..668547c2de84 100644 --- a/drivers/net/wireless/mwifiex/scan.c +++ b/drivers/net/wireless/mwifiex/scan.c | |||
| @@ -2101,12 +2101,12 @@ mwifiex_save_curr_bcn(struct mwifiex_private *priv) | |||
| 2101 | curr_bss->ht_info_offset); | 2101 | curr_bss->ht_info_offset); |
| 2102 | 2102 | ||
| 2103 | if (curr_bss->bcn_vht_cap) | 2103 | if (curr_bss->bcn_vht_cap) |
| 2104 | curr_bss->bcn_ht_cap = (void *)(curr_bss->beacon_buf + | 2104 | curr_bss->bcn_vht_cap = (void *)(curr_bss->beacon_buf + |
| 2105 | curr_bss->vht_cap_offset); | 2105 | curr_bss->vht_cap_offset); |
| 2106 | 2106 | ||
| 2107 | if (curr_bss->bcn_vht_oper) | 2107 | if (curr_bss->bcn_vht_oper) |
| 2108 | curr_bss->bcn_ht_oper = (void *)(curr_bss->beacon_buf + | 2108 | curr_bss->bcn_vht_oper = (void *)(curr_bss->beacon_buf + |
| 2109 | curr_bss->vht_info_offset); | 2109 | curr_bss->vht_info_offset); |
| 2110 | 2110 | ||
| 2111 | if (curr_bss->bcn_bss_co_2040) | 2111 | if (curr_bss->bcn_bss_co_2040) |
| 2112 | curr_bss->bcn_bss_co_2040 = | 2112 | curr_bss->bcn_bss_co_2040 = |
diff --git a/drivers/net/wireless/ti/wl1251/rx.c b/drivers/net/wireless/ti/wl1251/rx.c index 123c4bb50e0a..cde0eaf99714 100644 --- a/drivers/net/wireless/ti/wl1251/rx.c +++ b/drivers/net/wireless/ti/wl1251/rx.c | |||
| @@ -180,7 +180,7 @@ static void wl1251_rx_body(struct wl1251 *wl, | |||
| 180 | wl1251_mem_read(wl, rx_packet_ring_addr, rx_buffer, length); | 180 | wl1251_mem_read(wl, rx_packet_ring_addr, rx_buffer, length); |
| 181 | 181 | ||
| 182 | /* The actual length doesn't include the target's alignment */ | 182 | /* The actual length doesn't include the target's alignment */ |
| 183 | skb->len = desc->length - PLCP_HEADER_LENGTH; | 183 | skb_trim(skb, desc->length - PLCP_HEADER_LENGTH); |
| 184 | 184 | ||
| 185 | fc = (u16 *)skb->data; | 185 | fc = (u16 *)skb->data; |
| 186 | 186 | ||
diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c index 7669d49a67e2..301cc037fda8 100644 --- a/drivers/net/xen-netback/interface.c +++ b/drivers/net/xen-netback/interface.c | |||
| @@ -132,8 +132,7 @@ static int xenvif_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 132 | /* If the skb is GSO then we'll also need an extra slot for the | 132 | /* If the skb is GSO then we'll also need an extra slot for the |
| 133 | * metadata. | 133 | * metadata. |
| 134 | */ | 134 | */ |
| 135 | if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV4 || | 135 | if (skb_is_gso(skb)) |
| 136 | skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6) | ||
| 137 | min_slots_needed++; | 136 | min_slots_needed++; |
| 138 | 137 | ||
| 139 | /* If the skb can't possibly fit in the remaining slots | 138 | /* If the skb can't possibly fit in the remaining slots |
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index e5284bca2d90..438d0c09b7e6 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c | |||
| @@ -240,7 +240,7 @@ static void xenvif_gop_frag_copy(struct xenvif *vif, struct sk_buff *skb, | |||
| 240 | struct gnttab_copy *copy_gop; | 240 | struct gnttab_copy *copy_gop; |
| 241 | struct xenvif_rx_meta *meta; | 241 | struct xenvif_rx_meta *meta; |
| 242 | unsigned long bytes; | 242 | unsigned long bytes; |
| 243 | int gso_type; | 243 | int gso_type = XEN_NETIF_GSO_TYPE_NONE; |
| 244 | 244 | ||
| 245 | /* Data must not cross a page boundary. */ | 245 | /* Data must not cross a page boundary. */ |
| 246 | BUG_ON(size + offset > PAGE_SIZE<<compound_order(page)); | 246 | BUG_ON(size + offset > PAGE_SIZE<<compound_order(page)); |
| @@ -299,12 +299,12 @@ static void xenvif_gop_frag_copy(struct xenvif *vif, struct sk_buff *skb, | |||
| 299 | } | 299 | } |
| 300 | 300 | ||
| 301 | /* Leave a gap for the GSO descriptor. */ | 301 | /* Leave a gap for the GSO descriptor. */ |
| 302 | if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV4) | 302 | if (skb_is_gso(skb)) { |
| 303 | gso_type = XEN_NETIF_GSO_TYPE_TCPV4; | 303 | if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV4) |
| 304 | else if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6) | 304 | gso_type = XEN_NETIF_GSO_TYPE_TCPV4; |
| 305 | gso_type = XEN_NETIF_GSO_TYPE_TCPV6; | 305 | else if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6) |
| 306 | else | 306 | gso_type = XEN_NETIF_GSO_TYPE_TCPV6; |
| 307 | gso_type = XEN_NETIF_GSO_TYPE_NONE; | 307 | } |
| 308 | 308 | ||
| 309 | if (*head && ((1 << gso_type) & vif->gso_mask)) | 309 | if (*head && ((1 << gso_type) & vif->gso_mask)) |
| 310 | vif->rx.req_cons++; | 310 | vif->rx.req_cons++; |
| @@ -338,19 +338,15 @@ static int xenvif_gop_skb(struct sk_buff *skb, | |||
| 338 | int head = 1; | 338 | int head = 1; |
| 339 | int old_meta_prod; | 339 | int old_meta_prod; |
| 340 | int gso_type; | 340 | int gso_type; |
| 341 | int gso_size; | ||
| 342 | 341 | ||
| 343 | old_meta_prod = npo->meta_prod; | 342 | old_meta_prod = npo->meta_prod; |
| 344 | 343 | ||
| 345 | if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV4) { | 344 | gso_type = XEN_NETIF_GSO_TYPE_NONE; |
| 346 | gso_type = XEN_NETIF_GSO_TYPE_TCPV4; | 345 | if (skb_is_gso(skb)) { |
| 347 | gso_size = skb_shinfo(skb)->gso_size; | 346 | if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV4) |
| 348 | } else if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6) { | 347 | gso_type = XEN_NETIF_GSO_TYPE_TCPV4; |
| 349 | gso_type = XEN_NETIF_GSO_TYPE_TCPV6; | 348 | else if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6) |
| 350 | gso_size = skb_shinfo(skb)->gso_size; | 349 | gso_type = XEN_NETIF_GSO_TYPE_TCPV6; |
| 351 | } else { | ||
| 352 | gso_type = XEN_NETIF_GSO_TYPE_NONE; | ||
| 353 | gso_size = 0; | ||
| 354 | } | 350 | } |
| 355 | 351 | ||
| 356 | /* Set up a GSO prefix descriptor, if necessary */ | 352 | /* Set up a GSO prefix descriptor, if necessary */ |
| @@ -358,7 +354,7 @@ static int xenvif_gop_skb(struct sk_buff *skb, | |||
| 358 | req = RING_GET_REQUEST(&vif->rx, vif->rx.req_cons++); | 354 | req = RING_GET_REQUEST(&vif->rx, vif->rx.req_cons++); |
| 359 | meta = npo->meta + npo->meta_prod++; | 355 | meta = npo->meta + npo->meta_prod++; |
| 360 | meta->gso_type = gso_type; | 356 | meta->gso_type = gso_type; |
| 361 | meta->gso_size = gso_size; | 357 | meta->gso_size = skb_shinfo(skb)->gso_size; |
| 362 | meta->size = 0; | 358 | meta->size = 0; |
| 363 | meta->id = req->id; | 359 | meta->id = req->id; |
| 364 | } | 360 | } |
| @@ -368,7 +364,7 @@ static int xenvif_gop_skb(struct sk_buff *skb, | |||
| 368 | 364 | ||
| 369 | if ((1 << gso_type) & vif->gso_mask) { | 365 | if ((1 << gso_type) & vif->gso_mask) { |
| 370 | meta->gso_type = gso_type; | 366 | meta->gso_type = gso_type; |
| 371 | meta->gso_size = gso_size; | 367 | meta->gso_size = skb_shinfo(skb)->gso_size; |
| 372 | } else { | 368 | } else { |
| 373 | meta->gso_type = XEN_NETIF_GSO_TYPE_NONE; | 369 | meta->gso_type = XEN_NETIF_GSO_TYPE_NONE; |
| 374 | meta->gso_size = 0; | 370 | meta->gso_size = 0; |
| @@ -500,8 +496,9 @@ static void xenvif_rx_action(struct xenvif *vif) | |||
| 500 | size = skb_frag_size(&skb_shinfo(skb)->frags[i]); | 496 | size = skb_frag_size(&skb_shinfo(skb)->frags[i]); |
| 501 | max_slots_needed += DIV_ROUND_UP(size, PAGE_SIZE); | 497 | max_slots_needed += DIV_ROUND_UP(size, PAGE_SIZE); |
| 502 | } | 498 | } |
| 503 | if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV4 || | 499 | if (skb_is_gso(skb) && |
| 504 | skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6) | 500 | (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV4 || |
| 501 | skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6)) | ||
| 505 | max_slots_needed++; | 502 | max_slots_needed++; |
| 506 | 503 | ||
| 507 | /* If the skb may not fit then bail out now */ | 504 | /* If the skb may not fit then bail out now */ |
