diff options
Diffstat (limited to 'drivers/net')
39 files changed, 483 insertions, 228 deletions
diff --git a/drivers/net/3c59x.c b/drivers/net/3c59x.c index a045559c81cf..179871d9e71f 100644 --- a/drivers/net/3c59x.c +++ b/drivers/net/3c59x.c | |||
| @@ -635,6 +635,9 @@ struct vortex_private { | |||
| 635 | must_free_region:1, /* Flag: if zero, Cardbus owns the I/O region */ | 635 | must_free_region:1, /* Flag: if zero, Cardbus owns the I/O region */ |
| 636 | large_frames:1, /* accept large frames */ | 636 | large_frames:1, /* accept large frames */ |
| 637 | handling_irq:1; /* private in_irq indicator */ | 637 | handling_irq:1; /* private in_irq indicator */ |
| 638 | /* {get|set}_wol operations are already serialized by rtnl. | ||
| 639 | * no additional locking is required for the enable_wol and acpi_set_WOL() | ||
| 640 | */ | ||
| 638 | int drv_flags; | 641 | int drv_flags; |
| 639 | u16 status_enable; | 642 | u16 status_enable; |
| 640 | u16 intr_enable; | 643 | u16 intr_enable; |
| @@ -1994,10 +1997,9 @@ vortex_error(struct net_device *dev, int status) | |||
| 1994 | } | 1997 | } |
| 1995 | } | 1998 | } |
| 1996 | 1999 | ||
| 1997 | if (status & RxEarly) { /* Rx early is unused. */ | 2000 | if (status & RxEarly) /* Rx early is unused. */ |
| 1998 | vortex_rx(dev); | ||
| 1999 | iowrite16(AckIntr | RxEarly, ioaddr + EL3_CMD); | 2001 | iowrite16(AckIntr | RxEarly, ioaddr + EL3_CMD); |
| 2000 | } | 2002 | |
| 2001 | if (status & StatsFull) { /* Empty statistics. */ | 2003 | if (status & StatsFull) { /* Empty statistics. */ |
| 2002 | static int DoneDidThat; | 2004 | static int DoneDidThat; |
| 2003 | if (vortex_debug > 4) | 2005 | if (vortex_debug > 4) |
| @@ -2298,7 +2300,12 @@ vortex_interrupt(int irq, void *dev_id) | |||
| 2298 | if (status & (HostError | RxEarly | StatsFull | TxComplete | IntReq)) { | 2300 | if (status & (HostError | RxEarly | StatsFull | TxComplete | IntReq)) { |
| 2299 | if (status == 0xffff) | 2301 | if (status == 0xffff) |
| 2300 | break; | 2302 | break; |
| 2303 | if (status & RxEarly) | ||
| 2304 | vortex_rx(dev); | ||
| 2305 | spin_unlock(&vp->window_lock); | ||
| 2301 | vortex_error(dev, status); | 2306 | vortex_error(dev, status); |
| 2307 | spin_lock(&vp->window_lock); | ||
| 2308 | window_set(vp, 7); | ||
| 2302 | } | 2309 | } |
| 2303 | 2310 | ||
| 2304 | if (--work_done < 0) { | 2311 | if (--work_done < 0) { |
| @@ -2935,28 +2942,31 @@ static void vortex_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) | |||
| 2935 | { | 2942 | { |
| 2936 | struct vortex_private *vp = netdev_priv(dev); | 2943 | struct vortex_private *vp = netdev_priv(dev); |
| 2937 | 2944 | ||
| 2938 | spin_lock_irq(&vp->lock); | 2945 | if (!VORTEX_PCI(vp)) |
| 2946 | return; | ||
| 2947 | |||
| 2939 | wol->supported = WAKE_MAGIC; | 2948 | wol->supported = WAKE_MAGIC; |
| 2940 | 2949 | ||
| 2941 | wol->wolopts = 0; | 2950 | wol->wolopts = 0; |
| 2942 | if (vp->enable_wol) | 2951 | if (vp->enable_wol) |
| 2943 | wol->wolopts |= WAKE_MAGIC; | 2952 | wol->wolopts |= WAKE_MAGIC; |
| 2944 | spin_unlock_irq(&vp->lock); | ||
| 2945 | } | 2953 | } |
| 2946 | 2954 | ||
| 2947 | static int vortex_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) | 2955 | static int vortex_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) |
| 2948 | { | 2956 | { |
| 2949 | struct vortex_private *vp = netdev_priv(dev); | 2957 | struct vortex_private *vp = netdev_priv(dev); |
| 2958 | |||
| 2959 | if (!VORTEX_PCI(vp)) | ||
| 2960 | return -EOPNOTSUPP; | ||
| 2961 | |||
| 2950 | if (wol->wolopts & ~WAKE_MAGIC) | 2962 | if (wol->wolopts & ~WAKE_MAGIC) |
| 2951 | return -EINVAL; | 2963 | return -EINVAL; |
| 2952 | 2964 | ||
| 2953 | spin_lock_irq(&vp->lock); | ||
| 2954 | if (wol->wolopts & WAKE_MAGIC) | 2965 | if (wol->wolopts & WAKE_MAGIC) |
| 2955 | vp->enable_wol = 1; | 2966 | vp->enable_wol = 1; |
| 2956 | else | 2967 | else |
| 2957 | vp->enable_wol = 0; | 2968 | vp->enable_wol = 0; |
| 2958 | acpi_set_WOL(dev); | 2969 | acpi_set_WOL(dev); |
| 2959 | spin_unlock_irq(&vp->lock); | ||
| 2960 | 2970 | ||
| 2961 | return 0; | 2971 | return 0; |
| 2962 | } | 2972 | } |
| @@ -3198,6 +3208,9 @@ static void acpi_set_WOL(struct net_device *dev) | |||
| 3198 | return; | 3208 | return; |
| 3199 | } | 3209 | } |
| 3200 | 3210 | ||
| 3211 | if (VORTEX_PCI(vp)->current_state < PCI_D3hot) | ||
| 3212 | return; | ||
| 3213 | |||
| 3201 | /* Change the power state to D3; RxEnable doesn't take effect. */ | 3214 | /* Change the power state to D3; RxEnable doesn't take effect. */ |
| 3202 | pci_set_power_state(VORTEX_PCI(vp), PCI_D3hot); | 3215 | pci_set_power_state(VORTEX_PCI(vp), PCI_D3hot); |
| 3203 | } | 3216 | } |
diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c index 63b9ba0cc67e..c73be2848319 100644 --- a/drivers/net/atlx/atl1.c +++ b/drivers/net/atlx/atl1.c | |||
| @@ -1251,6 +1251,12 @@ static void atl1_free_ring_resources(struct atl1_adapter *adapter) | |||
| 1251 | 1251 | ||
| 1252 | rrd_ring->desc = NULL; | 1252 | rrd_ring->desc = NULL; |
| 1253 | rrd_ring->dma = 0; | 1253 | rrd_ring->dma = 0; |
| 1254 | |||
| 1255 | adapter->cmb.dma = 0; | ||
| 1256 | adapter->cmb.cmb = NULL; | ||
| 1257 | |||
| 1258 | adapter->smb.dma = 0; | ||
| 1259 | adapter->smb.smb = NULL; | ||
| 1254 | } | 1260 | } |
| 1255 | 1261 | ||
| 1256 | static void atl1_setup_mac_ctrl(struct atl1_adapter *adapter) | 1262 | static void atl1_setup_mac_ctrl(struct atl1_adapter *adapter) |
| @@ -2847,10 +2853,11 @@ static int atl1_resume(struct pci_dev *pdev) | |||
| 2847 | pci_enable_wake(pdev, PCI_D3cold, 0); | 2853 | pci_enable_wake(pdev, PCI_D3cold, 0); |
| 2848 | 2854 | ||
| 2849 | atl1_reset_hw(&adapter->hw); | 2855 | atl1_reset_hw(&adapter->hw); |
| 2850 | adapter->cmb.cmb->int_stats = 0; | ||
| 2851 | 2856 | ||
| 2852 | if (netif_running(netdev)) | 2857 | if (netif_running(netdev)) { |
| 2858 | adapter->cmb.cmb->int_stats = 0; | ||
| 2853 | atl1_up(adapter); | 2859 | atl1_up(adapter); |
| 2860 | } | ||
| 2854 | netif_device_attach(netdev); | 2861 | netif_device_attach(netdev); |
| 2855 | 2862 | ||
| 2856 | return 0; | 2863 | return 0; |
diff --git a/drivers/net/b44.c b/drivers/net/b44.c index 37617abc1647..1e620e287ae0 100644 --- a/drivers/net/b44.c +++ b/drivers/net/b44.c | |||
| @@ -848,6 +848,15 @@ static int b44_poll(struct napi_struct *napi, int budget) | |||
| 848 | b44_tx(bp); | 848 | b44_tx(bp); |
| 849 | /* spin_unlock(&bp->tx_lock); */ | 849 | /* spin_unlock(&bp->tx_lock); */ |
| 850 | } | 850 | } |
| 851 | if (bp->istat & ISTAT_RFO) { /* fast recovery, in ~20msec */ | ||
| 852 | bp->istat &= ~ISTAT_RFO; | ||
| 853 | b44_disable_ints(bp); | ||
| 854 | ssb_device_enable(bp->sdev, 0); /* resets ISTAT_RFO */ | ||
| 855 | b44_init_rings(bp); | ||
| 856 | b44_init_hw(bp, B44_FULL_RESET_SKIP_PHY); | ||
| 857 | netif_wake_queue(bp->dev); | ||
| 858 | } | ||
| 859 | |||
| 851 | spin_unlock_irqrestore(&bp->lock, flags); | 860 | spin_unlock_irqrestore(&bp->lock, flags); |
| 852 | 861 | ||
| 853 | work_done = 0; | 862 | work_done = 0; |
diff --git a/drivers/net/benet/be.h b/drivers/net/benet/be.h index 99197bd54da5..53306bf3f401 100644 --- a/drivers/net/benet/be.h +++ b/drivers/net/benet/be.h | |||
| @@ -181,6 +181,7 @@ struct be_drvr_stats { | |||
| 181 | u64 be_rx_bytes_prev; | 181 | u64 be_rx_bytes_prev; |
| 182 | u64 be_rx_pkts; | 182 | u64 be_rx_pkts; |
| 183 | u32 be_rx_rate; | 183 | u32 be_rx_rate; |
| 184 | u32 be_rx_mcast_pkt; | ||
| 184 | /* number of non ether type II frames dropped where | 185 | /* number of non ether type II frames dropped where |
| 185 | * frame len > length field of Mac Hdr */ | 186 | * frame len > length field of Mac Hdr */ |
| 186 | u32 be_802_3_dropped_frames; | 187 | u32 be_802_3_dropped_frames; |
diff --git a/drivers/net/benet/be_cmds.c b/drivers/net/benet/be_cmds.c index 3d305494a606..34abcc9403d6 100644 --- a/drivers/net/benet/be_cmds.c +++ b/drivers/net/benet/be_cmds.c | |||
| @@ -140,10 +140,8 @@ int be_process_mcc(struct be_adapter *adapter, int *status) | |||
| 140 | while ((compl = be_mcc_compl_get(adapter))) { | 140 | while ((compl = be_mcc_compl_get(adapter))) { |
| 141 | if (compl->flags & CQE_FLAGS_ASYNC_MASK) { | 141 | if (compl->flags & CQE_FLAGS_ASYNC_MASK) { |
| 142 | /* Interpret flags as an async trailer */ | 142 | /* Interpret flags as an async trailer */ |
| 143 | BUG_ON(!is_link_state_evt(compl->flags)); | 143 | if (is_link_state_evt(compl->flags)) |
| 144 | 144 | be_async_link_state_process(adapter, | |
| 145 | /* Interpret compl as a async link evt */ | ||
| 146 | be_async_link_state_process(adapter, | ||
| 147 | (struct be_async_event_link_state *) compl); | 145 | (struct be_async_event_link_state *) compl); |
| 148 | } else if (compl->flags & CQE_FLAGS_COMPLETED_MASK) { | 146 | } else if (compl->flags & CQE_FLAGS_COMPLETED_MASK) { |
| 149 | *status = be_mcc_compl_process(adapter, compl); | 147 | *status = be_mcc_compl_process(adapter, compl); |
| @@ -207,7 +205,7 @@ static int be_mbox_db_ready_wait(struct be_adapter *adapter, void __iomem *db) | |||
| 207 | 205 | ||
| 208 | if (msecs > 4000) { | 206 | if (msecs > 4000) { |
| 209 | dev_err(&adapter->pdev->dev, "mbox poll timed out\n"); | 207 | dev_err(&adapter->pdev->dev, "mbox poll timed out\n"); |
| 210 | be_dump_ue(adapter); | 208 | be_detect_dump_ue(adapter); |
| 211 | return -1; | 209 | return -1; |
| 212 | } | 210 | } |
| 213 | 211 | ||
diff --git a/drivers/net/benet/be_cmds.h b/drivers/net/benet/be_cmds.h index bdc10a28cfda..ad1e6fac60c5 100644 --- a/drivers/net/benet/be_cmds.h +++ b/drivers/net/benet/be_cmds.h | |||
| @@ -992,5 +992,5 @@ extern int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num, | |||
| 992 | extern int be_cmd_get_phy_info(struct be_adapter *adapter, | 992 | extern int be_cmd_get_phy_info(struct be_adapter *adapter, |
| 993 | struct be_dma_mem *cmd); | 993 | struct be_dma_mem *cmd); |
| 994 | extern int be_cmd_set_qos(struct be_adapter *adapter, u32 bps, u32 domain); | 994 | extern int be_cmd_set_qos(struct be_adapter *adapter, u32 bps, u32 domain); |
| 995 | extern void be_dump_ue(struct be_adapter *adapter); | 995 | extern void be_detect_dump_ue(struct be_adapter *adapter); |
| 996 | 996 | ||
diff --git a/drivers/net/benet/be_ethtool.c b/drivers/net/benet/be_ethtool.c index cd16243c7c36..13f0abbc5205 100644 --- a/drivers/net/benet/be_ethtool.c +++ b/drivers/net/benet/be_ethtool.c | |||
| @@ -60,6 +60,7 @@ static const struct be_ethtool_stat et_stats[] = { | |||
| 60 | {DRVSTAT_INFO(be_rx_events)}, | 60 | {DRVSTAT_INFO(be_rx_events)}, |
| 61 | {DRVSTAT_INFO(be_tx_compl)}, | 61 | {DRVSTAT_INFO(be_tx_compl)}, |
| 62 | {DRVSTAT_INFO(be_rx_compl)}, | 62 | {DRVSTAT_INFO(be_rx_compl)}, |
| 63 | {DRVSTAT_INFO(be_rx_mcast_pkt)}, | ||
| 63 | {DRVSTAT_INFO(be_ethrx_post_fail)}, | 64 | {DRVSTAT_INFO(be_ethrx_post_fail)}, |
| 64 | {DRVSTAT_INFO(be_802_3_dropped_frames)}, | 65 | {DRVSTAT_INFO(be_802_3_dropped_frames)}, |
| 65 | {DRVSTAT_INFO(be_802_3_malformed_frames)}, | 66 | {DRVSTAT_INFO(be_802_3_malformed_frames)}, |
diff --git a/drivers/net/benet/be_hw.h b/drivers/net/benet/be_hw.h index 5d38046402b2..a2ec5df0d733 100644 --- a/drivers/net/benet/be_hw.h +++ b/drivers/net/benet/be_hw.h | |||
| @@ -167,8 +167,11 @@ | |||
| 167 | #define FLASH_FCoE_BIOS_START_g3 (13631488) | 167 | #define FLASH_FCoE_BIOS_START_g3 (13631488) |
| 168 | #define FLASH_REDBOOT_START_g3 (262144) | 168 | #define FLASH_REDBOOT_START_g3 (262144) |
| 169 | 169 | ||
| 170 | 170 | /************* Rx Packet Type Encoding **************/ | |
| 171 | 171 | #define BE_UNICAST_PACKET 0 | |
| 172 | #define BE_MULTICAST_PACKET 1 | ||
| 173 | #define BE_BROADCAST_PACKET 2 | ||
| 174 | #define BE_RSVD_PACKET 3 | ||
| 172 | 175 | ||
| 173 | /* | 176 | /* |
| 174 | * BE descriptors: host memory data structures whose formats | 177 | * BE descriptors: host memory data structures whose formats |
diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c index 74e146f470c6..6eda7a022256 100644 --- a/drivers/net/benet/be_main.c +++ b/drivers/net/benet/be_main.c | |||
| @@ -247,6 +247,7 @@ void netdev_stats_update(struct be_adapter *adapter) | |||
| 247 | dev_stats->tx_packets = drvr_stats(adapter)->be_tx_pkts; | 247 | dev_stats->tx_packets = drvr_stats(adapter)->be_tx_pkts; |
| 248 | dev_stats->rx_bytes = drvr_stats(adapter)->be_rx_bytes; | 248 | dev_stats->rx_bytes = drvr_stats(adapter)->be_rx_bytes; |
| 249 | dev_stats->tx_bytes = drvr_stats(adapter)->be_tx_bytes; | 249 | dev_stats->tx_bytes = drvr_stats(adapter)->be_tx_bytes; |
| 250 | dev_stats->multicast = drvr_stats(adapter)->be_rx_mcast_pkt; | ||
| 250 | 251 | ||
| 251 | /* bad pkts received */ | 252 | /* bad pkts received */ |
| 252 | dev_stats->rx_errors = port_stats->rx_crc_errors + | 253 | dev_stats->rx_errors = port_stats->rx_crc_errors + |
| @@ -294,7 +295,6 @@ void netdev_stats_update(struct be_adapter *adapter) | |||
| 294 | /* no space available in linux */ | 295 | /* no space available in linux */ |
| 295 | dev_stats->tx_dropped = 0; | 296 | dev_stats->tx_dropped = 0; |
| 296 | 297 | ||
| 297 | dev_stats->multicast = port_stats->rx_multicast_frames; | ||
| 298 | dev_stats->collisions = 0; | 298 | dev_stats->collisions = 0; |
| 299 | 299 | ||
| 300 | /* detailed tx_errors */ | 300 | /* detailed tx_errors */ |
| @@ -848,7 +848,7 @@ static void be_rx_rate_update(struct be_adapter *adapter) | |||
| 848 | } | 848 | } |
| 849 | 849 | ||
| 850 | static void be_rx_stats_update(struct be_adapter *adapter, | 850 | static void be_rx_stats_update(struct be_adapter *adapter, |
| 851 | u32 pktsize, u16 numfrags) | 851 | u32 pktsize, u16 numfrags, u8 pkt_type) |
| 852 | { | 852 | { |
| 853 | struct be_drvr_stats *stats = drvr_stats(adapter); | 853 | struct be_drvr_stats *stats = drvr_stats(adapter); |
| 854 | 854 | ||
| @@ -856,6 +856,9 @@ static void be_rx_stats_update(struct be_adapter *adapter, | |||
| 856 | stats->be_rx_frags += numfrags; | 856 | stats->be_rx_frags += numfrags; |
| 857 | stats->be_rx_bytes += pktsize; | 857 | stats->be_rx_bytes += pktsize; |
| 858 | stats->be_rx_pkts++; | 858 | stats->be_rx_pkts++; |
| 859 | |||
| 860 | if (pkt_type == BE_MULTICAST_PACKET) | ||
| 861 | stats->be_rx_mcast_pkt++; | ||
| 859 | } | 862 | } |
| 860 | 863 | ||
| 861 | static inline bool do_pkt_csum(struct be_eth_rx_compl *rxcp, bool cso) | 864 | static inline bool do_pkt_csum(struct be_eth_rx_compl *rxcp, bool cso) |
| @@ -925,9 +928,11 @@ static void skb_fill_rx_data(struct be_adapter *adapter, | |||
| 925 | u16 rxq_idx, i, j; | 928 | u16 rxq_idx, i, j; |
| 926 | u32 pktsize, hdr_len, curr_frag_len, size; | 929 | u32 pktsize, hdr_len, curr_frag_len, size; |
| 927 | u8 *start; | 930 | u8 *start; |
| 931 | u8 pkt_type; | ||
| 928 | 932 | ||
| 929 | rxq_idx = AMAP_GET_BITS(struct amap_eth_rx_compl, fragndx, rxcp); | 933 | rxq_idx = AMAP_GET_BITS(struct amap_eth_rx_compl, fragndx, rxcp); |
| 930 | pktsize = AMAP_GET_BITS(struct amap_eth_rx_compl, pktsize, rxcp); | 934 | pktsize = AMAP_GET_BITS(struct amap_eth_rx_compl, pktsize, rxcp); |
| 935 | pkt_type = AMAP_GET_BITS(struct amap_eth_rx_compl, cast_enc, rxcp); | ||
| 931 | 936 | ||
| 932 | page_info = get_rx_page_info(adapter, rxq_idx); | 937 | page_info = get_rx_page_info(adapter, rxq_idx); |
| 933 | 938 | ||
| @@ -993,7 +998,7 @@ static void skb_fill_rx_data(struct be_adapter *adapter, | |||
| 993 | BUG_ON(j > MAX_SKB_FRAGS); | 998 | BUG_ON(j > MAX_SKB_FRAGS); |
| 994 | 999 | ||
| 995 | done: | 1000 | done: |
| 996 | be_rx_stats_update(adapter, pktsize, num_rcvd); | 1001 | be_rx_stats_update(adapter, pktsize, num_rcvd, pkt_type); |
| 997 | } | 1002 | } |
| 998 | 1003 | ||
| 999 | /* Process the RX completion indicated by rxcp when GRO is disabled */ | 1004 | /* Process the RX completion indicated by rxcp when GRO is disabled */ |
| @@ -1060,6 +1065,7 @@ static void be_rx_compl_process_gro(struct be_adapter *adapter, | |||
| 1060 | u32 num_rcvd, pkt_size, remaining, vlanf, curr_frag_len; | 1065 | u32 num_rcvd, pkt_size, remaining, vlanf, curr_frag_len; |
| 1061 | u16 i, rxq_idx = 0, vid, j; | 1066 | u16 i, rxq_idx = 0, vid, j; |
| 1062 | u8 vtm; | 1067 | u8 vtm; |
| 1068 | u8 pkt_type; | ||
| 1063 | 1069 | ||
| 1064 | num_rcvd = AMAP_GET_BITS(struct amap_eth_rx_compl, numfrags, rxcp); | 1070 | num_rcvd = AMAP_GET_BITS(struct amap_eth_rx_compl, numfrags, rxcp); |
| 1065 | /* Is it a flush compl that has no data */ | 1071 | /* Is it a flush compl that has no data */ |
| @@ -1070,6 +1076,7 @@ static void be_rx_compl_process_gro(struct be_adapter *adapter, | |||
| 1070 | vlanf = AMAP_GET_BITS(struct amap_eth_rx_compl, vtp, rxcp); | 1076 | vlanf = AMAP_GET_BITS(struct amap_eth_rx_compl, vtp, rxcp); |
| 1071 | rxq_idx = AMAP_GET_BITS(struct amap_eth_rx_compl, fragndx, rxcp); | 1077 | rxq_idx = AMAP_GET_BITS(struct amap_eth_rx_compl, fragndx, rxcp); |
| 1072 | vtm = AMAP_GET_BITS(struct amap_eth_rx_compl, vtm, rxcp); | 1078 | vtm = AMAP_GET_BITS(struct amap_eth_rx_compl, vtm, rxcp); |
| 1079 | pkt_type = AMAP_GET_BITS(struct amap_eth_rx_compl, cast_enc, rxcp); | ||
| 1073 | 1080 | ||
| 1074 | /* vlanf could be wrongly set in some cards. | 1081 | /* vlanf could be wrongly set in some cards. |
| 1075 | * ignore if vtm is not set */ | 1082 | * ignore if vtm is not set */ |
| @@ -1125,7 +1132,7 @@ static void be_rx_compl_process_gro(struct be_adapter *adapter, | |||
| 1125 | vlan_gro_frags(&eq_obj->napi, adapter->vlan_grp, vid); | 1132 | vlan_gro_frags(&eq_obj->napi, adapter->vlan_grp, vid); |
| 1126 | } | 1133 | } |
| 1127 | 1134 | ||
| 1128 | be_rx_stats_update(adapter, pkt_size, num_rcvd); | 1135 | be_rx_stats_update(adapter, pkt_size, num_rcvd, pkt_type); |
| 1129 | } | 1136 | } |
| 1130 | 1137 | ||
| 1131 | static struct be_eth_rx_compl *be_rx_compl_get(struct be_adapter *adapter) | 1138 | static struct be_eth_rx_compl *be_rx_compl_get(struct be_adapter *adapter) |
| @@ -1743,26 +1750,7 @@ static int be_poll_tx_mcc(struct napi_struct *napi, int budget) | |||
| 1743 | return 1; | 1750 | return 1; |
| 1744 | } | 1751 | } |
| 1745 | 1752 | ||
| 1746 | static inline bool be_detect_ue(struct be_adapter *adapter) | 1753 | void be_detect_dump_ue(struct be_adapter *adapter) |
| 1747 | { | ||
| 1748 | u32 online0 = 0, online1 = 0; | ||
| 1749 | |||
| 1750 | pci_read_config_dword(adapter->pdev, PCICFG_ONLINE0, &online0); | ||
| 1751 | |||
| 1752 | pci_read_config_dword(adapter->pdev, PCICFG_ONLINE1, &online1); | ||
| 1753 | |||
| 1754 | if (!online0 || !online1) { | ||
| 1755 | adapter->ue_detected = true; | ||
| 1756 | dev_err(&adapter->pdev->dev, | ||
| 1757 | "UE Detected!! online0=%d online1=%d\n", | ||
| 1758 | online0, online1); | ||
| 1759 | return true; | ||
| 1760 | } | ||
| 1761 | |||
| 1762 | return false; | ||
| 1763 | } | ||
| 1764 | |||
| 1765 | void be_dump_ue(struct be_adapter *adapter) | ||
| 1766 | { | 1754 | { |
| 1767 | u32 ue_status_lo, ue_status_hi, ue_status_lo_mask, ue_status_hi_mask; | 1755 | u32 ue_status_lo, ue_status_hi, ue_status_lo_mask, ue_status_hi_mask; |
| 1768 | u32 i; | 1756 | u32 i; |
| @@ -1779,6 +1767,11 @@ void be_dump_ue(struct be_adapter *adapter) | |||
| 1779 | ue_status_lo = (ue_status_lo & (~ue_status_lo_mask)); | 1767 | ue_status_lo = (ue_status_lo & (~ue_status_lo_mask)); |
| 1780 | ue_status_hi = (ue_status_hi & (~ue_status_hi_mask)); | 1768 | ue_status_hi = (ue_status_hi & (~ue_status_hi_mask)); |
| 1781 | 1769 | ||
| 1770 | if (ue_status_lo || ue_status_hi) { | ||
| 1771 | adapter->ue_detected = true; | ||
| 1772 | dev_err(&adapter->pdev->dev, "UE Detected!!\n"); | ||
| 1773 | } | ||
| 1774 | |||
| 1782 | if (ue_status_lo) { | 1775 | if (ue_status_lo) { |
| 1783 | for (i = 0; ue_status_lo; ue_status_lo >>= 1, i++) { | 1776 | for (i = 0; ue_status_lo; ue_status_lo >>= 1, i++) { |
| 1784 | if (ue_status_lo & 1) | 1777 | if (ue_status_lo & 1) |
| @@ -1814,10 +1807,8 @@ static void be_worker(struct work_struct *work) | |||
| 1814 | adapter->rx_post_starved = false; | 1807 | adapter->rx_post_starved = false; |
| 1815 | be_post_rx_frags(adapter); | 1808 | be_post_rx_frags(adapter); |
| 1816 | } | 1809 | } |
| 1817 | if (!adapter->ue_detected) { | 1810 | if (!adapter->ue_detected) |
| 1818 | if (be_detect_ue(adapter)) | 1811 | be_detect_dump_ue(adapter); |
| 1819 | be_dump_ue(adapter); | ||
| 1820 | } | ||
| 1821 | 1812 | ||
| 1822 | schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000)); | 1813 | schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000)); |
| 1823 | } | 1814 | } |
diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c index 822f586d72af..0ddf4c66afe2 100644 --- a/drivers/net/bonding/bond_3ad.c +++ b/drivers/net/bonding/bond_3ad.c | |||
| @@ -2466,6 +2466,9 @@ int bond_3ad_lacpdu_recv(struct sk_buff *skb, struct net_device *dev, struct pac | |||
| 2466 | if (!(dev->flags & IFF_MASTER)) | 2466 | if (!(dev->flags & IFF_MASTER)) |
| 2467 | goto out; | 2467 | goto out; |
| 2468 | 2468 | ||
| 2469 | if (!pskb_may_pull(skb, sizeof(struct lacpdu))) | ||
| 2470 | goto out; | ||
| 2471 | |||
| 2469 | read_lock(&bond->lock); | 2472 | read_lock(&bond->lock); |
| 2470 | slave = bond_get_slave_by_dev((struct bonding *)netdev_priv(dev), | 2473 | slave = bond_get_slave_by_dev((struct bonding *)netdev_priv(dev), |
| 2471 | orig_dev); | 2474 | orig_dev); |
diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c index c746b331771d..26bb118c4533 100644 --- a/drivers/net/bonding/bond_alb.c +++ b/drivers/net/bonding/bond_alb.c | |||
| @@ -362,6 +362,9 @@ static int rlb_arp_recv(struct sk_buff *skb, struct net_device *bond_dev, struct | |||
| 362 | goto out; | 362 | goto out; |
| 363 | } | 363 | } |
| 364 | 364 | ||
| 365 | if (!pskb_may_pull(skb, arp_hdr_len(bond_dev))) | ||
| 366 | goto out; | ||
| 367 | |||
| 365 | if (skb->len < sizeof(struct arp_pkt)) { | 368 | if (skb->len < sizeof(struct arp_pkt)) { |
| 366 | pr_debug("Packet is too small to be an ARP\n"); | 369 | pr_debug("Packet is too small to be an ARP\n"); |
| 367 | goto out; | 370 | goto out; |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 2cc4cfc31892..3b16f62d5606 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
| @@ -2797,9 +2797,15 @@ void bond_loadbalance_arp_mon(struct work_struct *work) | |||
| 2797 | * so it can wait | 2797 | * so it can wait |
| 2798 | */ | 2798 | */ |
| 2799 | bond_for_each_slave(bond, slave, i) { | 2799 | bond_for_each_slave(bond, slave, i) { |
| 2800 | unsigned long trans_start = dev_trans_start(slave->dev); | ||
| 2801 | |||
| 2800 | if (slave->link != BOND_LINK_UP) { | 2802 | if (slave->link != BOND_LINK_UP) { |
| 2801 | if (time_before_eq(jiffies, dev_trans_start(slave->dev) + delta_in_ticks) && | 2803 | if (time_in_range(jiffies, |
| 2802 | time_before_eq(jiffies, slave->dev->last_rx + delta_in_ticks)) { | 2804 | trans_start - delta_in_ticks, |
| 2805 | trans_start + delta_in_ticks) && | ||
| 2806 | time_in_range(jiffies, | ||
| 2807 | slave->dev->last_rx - delta_in_ticks, | ||
| 2808 | slave->dev->last_rx + delta_in_ticks)) { | ||
| 2803 | 2809 | ||
| 2804 | slave->link = BOND_LINK_UP; | 2810 | slave->link = BOND_LINK_UP; |
| 2805 | slave->state = BOND_STATE_ACTIVE; | 2811 | slave->state = BOND_STATE_ACTIVE; |
| @@ -2827,8 +2833,12 @@ void bond_loadbalance_arp_mon(struct work_struct *work) | |||
| 2827 | * when the source ip is 0, so don't take the link down | 2833 | * when the source ip is 0, so don't take the link down |
| 2828 | * if we don't know our ip yet | 2834 | * if we don't know our ip yet |
| 2829 | */ | 2835 | */ |
| 2830 | if (time_after_eq(jiffies, dev_trans_start(slave->dev) + 2*delta_in_ticks) || | 2836 | if (!time_in_range(jiffies, |
| 2831 | (time_after_eq(jiffies, slave->dev->last_rx + 2*delta_in_ticks))) { | 2837 | trans_start - delta_in_ticks, |
| 2838 | trans_start + 2 * delta_in_ticks) || | ||
| 2839 | !time_in_range(jiffies, | ||
| 2840 | slave->dev->last_rx - delta_in_ticks, | ||
| 2841 | slave->dev->last_rx + 2 * delta_in_ticks)) { | ||
| 2832 | 2842 | ||
| 2833 | slave->link = BOND_LINK_DOWN; | 2843 | slave->link = BOND_LINK_DOWN; |
| 2834 | slave->state = BOND_STATE_BACKUP; | 2844 | slave->state = BOND_STATE_BACKUP; |
| @@ -2883,13 +2893,16 @@ static int bond_ab_arp_inspect(struct bonding *bond, int delta_in_ticks) | |||
| 2883 | { | 2893 | { |
| 2884 | struct slave *slave; | 2894 | struct slave *slave; |
| 2885 | int i, commit = 0; | 2895 | int i, commit = 0; |
| 2896 | unsigned long trans_start; | ||
| 2886 | 2897 | ||
| 2887 | bond_for_each_slave(bond, slave, i) { | 2898 | bond_for_each_slave(bond, slave, i) { |
| 2888 | slave->new_link = BOND_LINK_NOCHANGE; | 2899 | slave->new_link = BOND_LINK_NOCHANGE; |
| 2889 | 2900 | ||
| 2890 | if (slave->link != BOND_LINK_UP) { | 2901 | if (slave->link != BOND_LINK_UP) { |
| 2891 | if (time_before_eq(jiffies, slave_last_rx(bond, slave) + | 2902 | if (time_in_range(jiffies, |
| 2892 | delta_in_ticks)) { | 2903 | slave_last_rx(bond, slave) - delta_in_ticks, |
| 2904 | slave_last_rx(bond, slave) + delta_in_ticks)) { | ||
| 2905 | |||
| 2893 | slave->new_link = BOND_LINK_UP; | 2906 | slave->new_link = BOND_LINK_UP; |
| 2894 | commit++; | 2907 | commit++; |
| 2895 | } | 2908 | } |
| @@ -2902,8 +2915,9 @@ static int bond_ab_arp_inspect(struct bonding *bond, int delta_in_ticks) | |||
| 2902 | * active. This avoids bouncing, as the last receive | 2915 | * active. This avoids bouncing, as the last receive |
| 2903 | * times need a full ARP monitor cycle to be updated. | 2916 | * times need a full ARP monitor cycle to be updated. |
| 2904 | */ | 2917 | */ |
| 2905 | if (!time_after_eq(jiffies, slave->jiffies + | 2918 | if (time_in_range(jiffies, |
| 2906 | 2 * delta_in_ticks)) | 2919 | slave->jiffies - delta_in_ticks, |
| 2920 | slave->jiffies + 2 * delta_in_ticks)) | ||
| 2907 | continue; | 2921 | continue; |
| 2908 | 2922 | ||
| 2909 | /* | 2923 | /* |
| @@ -2921,8 +2935,10 @@ static int bond_ab_arp_inspect(struct bonding *bond, int delta_in_ticks) | |||
| 2921 | */ | 2935 | */ |
| 2922 | if (slave->state == BOND_STATE_BACKUP && | 2936 | if (slave->state == BOND_STATE_BACKUP && |
| 2923 | !bond->current_arp_slave && | 2937 | !bond->current_arp_slave && |
| 2924 | time_after(jiffies, slave_last_rx(bond, slave) + | 2938 | !time_in_range(jiffies, |
| 2925 | 3 * delta_in_ticks)) { | 2939 | slave_last_rx(bond, slave) - delta_in_ticks, |
| 2940 | slave_last_rx(bond, slave) + 3 * delta_in_ticks)) { | ||
| 2941 | |||
| 2926 | slave->new_link = BOND_LINK_DOWN; | 2942 | slave->new_link = BOND_LINK_DOWN; |
| 2927 | commit++; | 2943 | commit++; |
| 2928 | } | 2944 | } |
| @@ -2933,11 +2949,15 @@ static int bond_ab_arp_inspect(struct bonding *bond, int delta_in_ticks) | |||
| 2933 | * - (more than 2*delta since receive AND | 2949 | * - (more than 2*delta since receive AND |
| 2934 | * the bond has an IP address) | 2950 | * the bond has an IP address) |
| 2935 | */ | 2951 | */ |
| 2952 | trans_start = dev_trans_start(slave->dev); | ||
| 2936 | if ((slave->state == BOND_STATE_ACTIVE) && | 2953 | if ((slave->state == BOND_STATE_ACTIVE) && |
| 2937 | (time_after_eq(jiffies, dev_trans_start(slave->dev) + | 2954 | (!time_in_range(jiffies, |
| 2938 | 2 * delta_in_ticks) || | 2955 | trans_start - delta_in_ticks, |
| 2939 | (time_after_eq(jiffies, slave_last_rx(bond, slave) | 2956 | trans_start + 2 * delta_in_ticks) || |
| 2940 | + 2 * delta_in_ticks)))) { | 2957 | !time_in_range(jiffies, |
| 2958 | slave_last_rx(bond, slave) - delta_in_ticks, | ||
| 2959 | slave_last_rx(bond, slave) + 2 * delta_in_ticks))) { | ||
| 2960 | |||
| 2941 | slave->new_link = BOND_LINK_DOWN; | 2961 | slave->new_link = BOND_LINK_DOWN; |
| 2942 | commit++; | 2962 | commit++; |
| 2943 | } | 2963 | } |
| @@ -2956,6 +2976,7 @@ static void bond_ab_arp_commit(struct bonding *bond, int delta_in_ticks) | |||
| 2956 | { | 2976 | { |
| 2957 | struct slave *slave; | 2977 | struct slave *slave; |
| 2958 | int i; | 2978 | int i; |
| 2979 | unsigned long trans_start; | ||
| 2959 | 2980 | ||
| 2960 | bond_for_each_slave(bond, slave, i) { | 2981 | bond_for_each_slave(bond, slave, i) { |
| 2961 | switch (slave->new_link) { | 2982 | switch (slave->new_link) { |
| @@ -2963,10 +2984,11 @@ static void bond_ab_arp_commit(struct bonding *bond, int delta_in_ticks) | |||
| 2963 | continue; | 2984 | continue; |
| 2964 | 2985 | ||
| 2965 | case BOND_LINK_UP: | 2986 | case BOND_LINK_UP: |
| 2987 | trans_start = dev_trans_start(slave->dev); | ||
| 2966 | if ((!bond->curr_active_slave && | 2988 | if ((!bond->curr_active_slave && |
| 2967 | time_before_eq(jiffies, | 2989 | time_in_range(jiffies, |
| 2968 | dev_trans_start(slave->dev) + | 2990 | trans_start - delta_in_ticks, |
| 2969 | delta_in_ticks)) || | 2991 | trans_start + delta_in_ticks)) || |
| 2970 | bond->curr_active_slave != slave) { | 2992 | bond->curr_active_slave != slave) { |
| 2971 | slave->link = BOND_LINK_UP; | 2993 | slave->link = BOND_LINK_UP; |
| 2972 | bond->current_arp_slave = NULL; | 2994 | bond->current_arp_slave = NULL; |
diff --git a/drivers/net/cxgb3/cxgb3_main.c b/drivers/net/cxgb3/cxgb3_main.c index ad19585d960b..f208712c0b90 100644 --- a/drivers/net/cxgb3/cxgb3_main.c +++ b/drivers/net/cxgb3/cxgb3_main.c | |||
| @@ -2296,6 +2296,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr) | |||
| 2296 | case CHELSIO_GET_QSET_NUM:{ | 2296 | case CHELSIO_GET_QSET_NUM:{ |
| 2297 | struct ch_reg edata; | 2297 | struct ch_reg edata; |
| 2298 | 2298 | ||
| 2299 | memset(&edata, 0, sizeof(struct ch_reg)); | ||
| 2300 | |||
| 2299 | edata.cmd = CHELSIO_GET_QSET_NUM; | 2301 | edata.cmd = CHELSIO_GET_QSET_NUM; |
| 2300 | edata.val = pi->nqsets; | 2302 | edata.val = pi->nqsets; |
| 2301 | if (copy_to_user(useraddr, &edata, sizeof(edata))) | 2303 | if (copy_to_user(useraddr, &edata, sizeof(edata))) |
diff --git a/drivers/net/e1000e/hw.h b/drivers/net/e1000e/hw.h index 66ed08f726fb..ba302a5c2c30 100644 --- a/drivers/net/e1000e/hw.h +++ b/drivers/net/e1000e/hw.h | |||
| @@ -57,6 +57,7 @@ enum e1e_registers { | |||
| 57 | E1000_SCTL = 0x00024, /* SerDes Control - RW */ | 57 | E1000_SCTL = 0x00024, /* SerDes Control - RW */ |
| 58 | E1000_FCAL = 0x00028, /* Flow Control Address Low - RW */ | 58 | E1000_FCAL = 0x00028, /* Flow Control Address Low - RW */ |
| 59 | E1000_FCAH = 0x0002C, /* Flow Control Address High -RW */ | 59 | E1000_FCAH = 0x0002C, /* Flow Control Address High -RW */ |
| 60 | E1000_FEXTNVM4 = 0x00024, /* Future Extended NVM 4 - RW */ | ||
| 60 | E1000_FEXTNVM = 0x00028, /* Future Extended NVM - RW */ | 61 | E1000_FEXTNVM = 0x00028, /* Future Extended NVM - RW */ |
| 61 | E1000_FCT = 0x00030, /* Flow Control Type - RW */ | 62 | E1000_FCT = 0x00030, /* Flow Control Type - RW */ |
| 62 | E1000_VET = 0x00038, /* VLAN Ether Type - RW */ | 63 | E1000_VET = 0x00038, /* VLAN Ether Type - RW */ |
diff --git a/drivers/net/e1000e/ich8lan.c b/drivers/net/e1000e/ich8lan.c index 63930d12711c..57b5435599ab 100644 --- a/drivers/net/e1000e/ich8lan.c +++ b/drivers/net/e1000e/ich8lan.c | |||
| @@ -105,6 +105,10 @@ | |||
| 105 | #define E1000_FEXTNVM_SW_CONFIG 1 | 105 | #define E1000_FEXTNVM_SW_CONFIG 1 |
| 106 | #define E1000_FEXTNVM_SW_CONFIG_ICH8M (1 << 27) /* Bit redefined for ICH8M :/ */ | 106 | #define E1000_FEXTNVM_SW_CONFIG_ICH8M (1 << 27) /* Bit redefined for ICH8M :/ */ |
| 107 | 107 | ||
| 108 | #define E1000_FEXTNVM4_BEACON_DURATION_MASK 0x7 | ||
| 109 | #define E1000_FEXTNVM4_BEACON_DURATION_8USEC 0x7 | ||
| 110 | #define E1000_FEXTNVM4_BEACON_DURATION_16USEC 0x3 | ||
| 111 | |||
| 108 | #define PCIE_ICH8_SNOOP_ALL PCIE_NO_SNOOP_ALL | 112 | #define PCIE_ICH8_SNOOP_ALL PCIE_NO_SNOOP_ALL |
| 109 | 113 | ||
| 110 | #define E1000_ICH_RAR_ENTRIES 7 | 114 | #define E1000_ICH_RAR_ENTRIES 7 |
| @@ -125,6 +129,7 @@ | |||
| 125 | 129 | ||
| 126 | /* SMBus Address Phy Register */ | 130 | /* SMBus Address Phy Register */ |
| 127 | #define HV_SMB_ADDR PHY_REG(768, 26) | 131 | #define HV_SMB_ADDR PHY_REG(768, 26) |
| 132 | #define HV_SMB_ADDR_MASK 0x007F | ||
| 128 | #define HV_SMB_ADDR_PEC_EN 0x0200 | 133 | #define HV_SMB_ADDR_PEC_EN 0x0200 |
| 129 | #define HV_SMB_ADDR_VALID 0x0080 | 134 | #define HV_SMB_ADDR_VALID 0x0080 |
| 130 | 135 | ||
| @@ -237,6 +242,8 @@ static s32 e1000_k1_gig_workaround_hv(struct e1000_hw *hw, bool link); | |||
| 237 | static s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw); | 242 | static s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw); |
| 238 | static bool e1000_check_mng_mode_ich8lan(struct e1000_hw *hw); | 243 | static bool e1000_check_mng_mode_ich8lan(struct e1000_hw *hw); |
| 239 | static bool e1000_check_mng_mode_pchlan(struct e1000_hw *hw); | 244 | static bool e1000_check_mng_mode_pchlan(struct e1000_hw *hw); |
| 245 | static s32 e1000_k1_workaround_lv(struct e1000_hw *hw); | ||
| 246 | static void e1000_gate_hw_phy_config_ich8lan(struct e1000_hw *hw, bool gate); | ||
| 240 | 247 | ||
| 241 | static inline u16 __er16flash(struct e1000_hw *hw, unsigned long reg) | 248 | static inline u16 __er16flash(struct e1000_hw *hw, unsigned long reg) |
| 242 | { | 249 | { |
| @@ -272,7 +279,7 @@ static inline void __ew32flash(struct e1000_hw *hw, unsigned long reg, u32 val) | |||
| 272 | static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw) | 279 | static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw) |
| 273 | { | 280 | { |
| 274 | struct e1000_phy_info *phy = &hw->phy; | 281 | struct e1000_phy_info *phy = &hw->phy; |
| 275 | u32 ctrl; | 282 | u32 ctrl, fwsm; |
| 276 | s32 ret_val = 0; | 283 | s32 ret_val = 0; |
| 277 | 284 | ||
| 278 | phy->addr = 1; | 285 | phy->addr = 1; |
| @@ -294,7 +301,8 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw) | |||
| 294 | * disabled, then toggle the LANPHYPC Value bit to force | 301 | * disabled, then toggle the LANPHYPC Value bit to force |
| 295 | * the interconnect to PCIe mode. | 302 | * the interconnect to PCIe mode. |
| 296 | */ | 303 | */ |
| 297 | if (!(er32(FWSM) & E1000_ICH_FWSM_FW_VALID)) { | 304 | fwsm = er32(FWSM); |
| 305 | if (!(fwsm & E1000_ICH_FWSM_FW_VALID)) { | ||
| 298 | ctrl = er32(CTRL); | 306 | ctrl = er32(CTRL); |
| 299 | ctrl |= E1000_CTRL_LANPHYPC_OVERRIDE; | 307 | ctrl |= E1000_CTRL_LANPHYPC_OVERRIDE; |
| 300 | ctrl &= ~E1000_CTRL_LANPHYPC_VALUE; | 308 | ctrl &= ~E1000_CTRL_LANPHYPC_VALUE; |
| @@ -303,6 +311,13 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw) | |||
| 303 | ctrl &= ~E1000_CTRL_LANPHYPC_OVERRIDE; | 311 | ctrl &= ~E1000_CTRL_LANPHYPC_OVERRIDE; |
| 304 | ew32(CTRL, ctrl); | 312 | ew32(CTRL, ctrl); |
| 305 | msleep(50); | 313 | msleep(50); |
| 314 | |||
| 315 | /* | ||
| 316 | * Gate automatic PHY configuration by hardware on | ||
| 317 | * non-managed 82579 | ||
| 318 | */ | ||
| 319 | if (hw->mac.type == e1000_pch2lan) | ||
| 320 | e1000_gate_hw_phy_config_ich8lan(hw, true); | ||
| 306 | } | 321 | } |
| 307 | 322 | ||
| 308 | /* | 323 | /* |
| @@ -315,6 +330,13 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw) | |||
| 315 | if (ret_val) | 330 | if (ret_val) |
| 316 | goto out; | 331 | goto out; |
| 317 | 332 | ||
| 333 | /* Ungate automatic PHY configuration on non-managed 82579 */ | ||
| 334 | if ((hw->mac.type == e1000_pch2lan) && | ||
| 335 | !(fwsm & E1000_ICH_FWSM_FW_VALID)) { | ||
| 336 | msleep(10); | ||
| 337 | e1000_gate_hw_phy_config_ich8lan(hw, false); | ||
| 338 | } | ||
| 339 | |||
| 318 | phy->id = e1000_phy_unknown; | 340 | phy->id = e1000_phy_unknown; |
| 319 | ret_val = e1000e_get_phy_id(hw); | 341 | ret_val = e1000e_get_phy_id(hw); |
| 320 | if (ret_val) | 342 | if (ret_val) |
| @@ -561,13 +583,10 @@ static s32 e1000_init_mac_params_ich8lan(struct e1000_adapter *adapter) | |||
| 561 | if (mac->type == e1000_ich8lan) | 583 | if (mac->type == e1000_ich8lan) |
| 562 | e1000e_set_kmrn_lock_loss_workaround_ich8lan(hw, true); | 584 | e1000e_set_kmrn_lock_loss_workaround_ich8lan(hw, true); |
| 563 | 585 | ||
| 564 | /* Disable PHY configuration by hardware, config by software */ | 586 | /* Gate automatic PHY configuration by hardware on managed 82579 */ |
| 565 | if (mac->type == e1000_pch2lan) { | 587 | if ((mac->type == e1000_pch2lan) && |
| 566 | u32 extcnf_ctrl = er32(EXTCNF_CTRL); | 588 | (er32(FWSM) & E1000_ICH_FWSM_FW_VALID)) |
| 567 | 589 | e1000_gate_hw_phy_config_ich8lan(hw, true); | |
| 568 | extcnf_ctrl |= E1000_EXTCNF_CTRL_GATE_PHY_CFG; | ||
| 569 | ew32(EXTCNF_CTRL, extcnf_ctrl); | ||
| 570 | } | ||
| 571 | 590 | ||
| 572 | return 0; | 591 | return 0; |
| 573 | } | 592 | } |
| @@ -652,6 +671,12 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw) | |||
| 652 | goto out; | 671 | goto out; |
| 653 | } | 672 | } |
| 654 | 673 | ||
| 674 | if (hw->mac.type == e1000_pch2lan) { | ||
| 675 | ret_val = e1000_k1_workaround_lv(hw); | ||
| 676 | if (ret_val) | ||
| 677 | goto out; | ||
| 678 | } | ||
| 679 | |||
| 655 | /* | 680 | /* |
| 656 | * Check if there was DownShift, must be checked | 681 | * Check if there was DownShift, must be checked |
| 657 | * immediately after link-up | 682 | * immediately after link-up |
| @@ -895,6 +920,34 @@ static s32 e1000_check_reset_block_ich8lan(struct e1000_hw *hw) | |||
| 895 | } | 920 | } |
| 896 | 921 | ||
| 897 | /** | 922 | /** |
| 923 | * e1000_write_smbus_addr - Write SMBus address to PHY needed during Sx states | ||
| 924 | * @hw: pointer to the HW structure | ||
| 925 | * | ||
| 926 | * Assumes semaphore already acquired. | ||
| 927 | * | ||
| 928 | **/ | ||
| 929 | static s32 e1000_write_smbus_addr(struct e1000_hw *hw) | ||
| 930 | { | ||
| 931 | u16 phy_data; | ||
| 932 | u32 strap = er32(STRAP); | ||
| 933 | s32 ret_val = 0; | ||
| 934 | |||
| 935 | strap &= E1000_STRAP_SMBUS_ADDRESS_MASK; | ||
| 936 | |||
| 937 | ret_val = e1000_read_phy_reg_hv_locked(hw, HV_SMB_ADDR, &phy_data); | ||
| 938 | if (ret_val) | ||
| 939 | goto out; | ||
| 940 | |||
| 941 | phy_data &= ~HV_SMB_ADDR_MASK; | ||
| 942 | phy_data |= (strap >> E1000_STRAP_SMBUS_ADDRESS_SHIFT); | ||
| 943 | phy_data |= HV_SMB_ADDR_PEC_EN | HV_SMB_ADDR_VALID; | ||
| 944 | ret_val = e1000_write_phy_reg_hv_locked(hw, HV_SMB_ADDR, phy_data); | ||
| 945 | |||
| 946 | out: | ||
| 947 | return ret_val; | ||
| 948 | } | ||
| 949 | |||
| 950 | /** | ||
| 898 | * e1000_sw_lcd_config_ich8lan - SW-based LCD Configuration | 951 | * e1000_sw_lcd_config_ich8lan - SW-based LCD Configuration |
| 899 | * @hw: pointer to the HW structure | 952 | * @hw: pointer to the HW structure |
| 900 | * | 953 | * |
| @@ -903,7 +956,6 @@ static s32 e1000_check_reset_block_ich8lan(struct e1000_hw *hw) | |||
| 903 | **/ | 956 | **/ |
| 904 | static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw) | 957 | static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw) |
| 905 | { | 958 | { |
| 906 | struct e1000_adapter *adapter = hw->adapter; | ||
| 907 | struct e1000_phy_info *phy = &hw->phy; | 959 | struct e1000_phy_info *phy = &hw->phy; |
| 908 | u32 i, data, cnf_size, cnf_base_addr, sw_cfg_mask; | 960 | u32 i, data, cnf_size, cnf_base_addr, sw_cfg_mask; |
| 909 | s32 ret_val = 0; | 961 | s32 ret_val = 0; |
| @@ -921,7 +973,8 @@ static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw) | |||
| 921 | if (phy->type != e1000_phy_igp_3) | 973 | if (phy->type != e1000_phy_igp_3) |
| 922 | return ret_val; | 974 | return ret_val; |
| 923 | 975 | ||
| 924 | if (adapter->pdev->device == E1000_DEV_ID_ICH8_IGP_AMT) { | 976 | if ((hw->adapter->pdev->device == E1000_DEV_ID_ICH8_IGP_AMT) || |
| 977 | (hw->adapter->pdev->device == E1000_DEV_ID_ICH8_IGP_C)) { | ||
| 925 | sw_cfg_mask = E1000_FEXTNVM_SW_CONFIG; | 978 | sw_cfg_mask = E1000_FEXTNVM_SW_CONFIG; |
| 926 | break; | 979 | break; |
| 927 | } | 980 | } |
| @@ -961,21 +1014,16 @@ static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw) | |||
| 961 | cnf_base_addr = data & E1000_EXTCNF_CTRL_EXT_CNF_POINTER_MASK; | 1014 | cnf_base_addr = data & E1000_EXTCNF_CTRL_EXT_CNF_POINTER_MASK; |
| 962 | cnf_base_addr >>= E1000_EXTCNF_CTRL_EXT_CNF_POINTER_SHIFT; | 1015 | cnf_base_addr >>= E1000_EXTCNF_CTRL_EXT_CNF_POINTER_SHIFT; |
| 963 | 1016 | ||
| 964 | if (!(data & E1000_EXTCNF_CTRL_OEM_WRITE_ENABLE) && | 1017 | if ((!(data & E1000_EXTCNF_CTRL_OEM_WRITE_ENABLE) && |
| 965 | ((hw->mac.type == e1000_pchlan) || | 1018 | (hw->mac.type == e1000_pchlan)) || |
| 966 | (hw->mac.type == e1000_pch2lan))) { | 1019 | (hw->mac.type == e1000_pch2lan)) { |
| 967 | /* | 1020 | /* |
| 968 | * HW configures the SMBus address and LEDs when the | 1021 | * HW configures the SMBus address and LEDs when the |
| 969 | * OEM and LCD Write Enable bits are set in the NVM. | 1022 | * OEM and LCD Write Enable bits are set in the NVM. |
| 970 | * When both NVM bits are cleared, SW will configure | 1023 | * When both NVM bits are cleared, SW will configure |
| 971 | * them instead. | 1024 | * them instead. |
| 972 | */ | 1025 | */ |
| 973 | data = er32(STRAP); | 1026 | ret_val = e1000_write_smbus_addr(hw); |
| 974 | data &= E1000_STRAP_SMBUS_ADDRESS_MASK; | ||
| 975 | reg_data = data >> E1000_STRAP_SMBUS_ADDRESS_SHIFT; | ||
| 976 | reg_data |= HV_SMB_ADDR_PEC_EN | HV_SMB_ADDR_VALID; | ||
| 977 | ret_val = e1000_write_phy_reg_hv_locked(hw, HV_SMB_ADDR, | ||
| 978 | reg_data); | ||
| 979 | if (ret_val) | 1027 | if (ret_val) |
| 980 | goto out; | 1028 | goto out; |
| 981 | 1029 | ||
| @@ -1440,10 +1488,6 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable) | |||
| 1440 | goto out; | 1488 | goto out; |
| 1441 | 1489 | ||
| 1442 | /* Enable jumbo frame workaround in the PHY */ | 1490 | /* Enable jumbo frame workaround in the PHY */ |
| 1443 | e1e_rphy(hw, PHY_REG(769, 20), &data); | ||
| 1444 | ret_val = e1e_wphy(hw, PHY_REG(769, 20), data & ~(1 << 14)); | ||
| 1445 | if (ret_val) | ||
| 1446 | goto out; | ||
| 1447 | e1e_rphy(hw, PHY_REG(769, 23), &data); | 1491 | e1e_rphy(hw, PHY_REG(769, 23), &data); |
| 1448 | data &= ~(0x7F << 5); | 1492 | data &= ~(0x7F << 5); |
| 1449 | data |= (0x37 << 5); | 1493 | data |= (0x37 << 5); |
| @@ -1452,7 +1496,6 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable) | |||
| 1452 | goto out; | 1496 | goto out; |
| 1453 | e1e_rphy(hw, PHY_REG(769, 16), &data); | 1497 | e1e_rphy(hw, PHY_REG(769, 16), &data); |
| 1454 | data &= ~(1 << 13); | 1498 | data &= ~(1 << 13); |
| 1455 | data |= (1 << 12); | ||
| 1456 | ret_val = e1e_wphy(hw, PHY_REG(769, 16), data); | 1499 | ret_val = e1e_wphy(hw, PHY_REG(769, 16), data); |
| 1457 | if (ret_val) | 1500 | if (ret_val) |
| 1458 | goto out; | 1501 | goto out; |
| @@ -1477,7 +1520,7 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable) | |||
| 1477 | 1520 | ||
| 1478 | mac_reg = er32(RCTL); | 1521 | mac_reg = er32(RCTL); |
| 1479 | mac_reg &= ~E1000_RCTL_SECRC; | 1522 | mac_reg &= ~E1000_RCTL_SECRC; |
| 1480 | ew32(FFLT_DBG, mac_reg); | 1523 | ew32(RCTL, mac_reg); |
| 1481 | 1524 | ||
| 1482 | ret_val = e1000e_read_kmrn_reg(hw, | 1525 | ret_val = e1000e_read_kmrn_reg(hw, |
| 1483 | E1000_KMRNCTRLSTA_CTRL_OFFSET, | 1526 | E1000_KMRNCTRLSTA_CTRL_OFFSET, |
| @@ -1503,17 +1546,12 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable) | |||
| 1503 | goto out; | 1546 | goto out; |
| 1504 | 1547 | ||
| 1505 | /* Write PHY register values back to h/w defaults */ | 1548 | /* Write PHY register values back to h/w defaults */ |
| 1506 | e1e_rphy(hw, PHY_REG(769, 20), &data); | ||
| 1507 | ret_val = e1e_wphy(hw, PHY_REG(769, 20), data & ~(1 << 14)); | ||
| 1508 | if (ret_val) | ||
| 1509 | goto out; | ||
| 1510 | e1e_rphy(hw, PHY_REG(769, 23), &data); | 1549 | e1e_rphy(hw, PHY_REG(769, 23), &data); |
| 1511 | data &= ~(0x7F << 5); | 1550 | data &= ~(0x7F << 5); |
| 1512 | ret_val = e1e_wphy(hw, PHY_REG(769, 23), data); | 1551 | ret_val = e1e_wphy(hw, PHY_REG(769, 23), data); |
| 1513 | if (ret_val) | 1552 | if (ret_val) |
| 1514 | goto out; | 1553 | goto out; |
| 1515 | e1e_rphy(hw, PHY_REG(769, 16), &data); | 1554 | e1e_rphy(hw, PHY_REG(769, 16), &data); |
| 1516 | data &= ~(1 << 12); | ||
| 1517 | data |= (1 << 13); | 1555 | data |= (1 << 13); |
| 1518 | ret_val = e1e_wphy(hw, PHY_REG(769, 16), data); | 1556 | ret_val = e1e_wphy(hw, PHY_REG(769, 16), data); |
| 1519 | if (ret_val) | 1557 | if (ret_val) |
| @@ -1559,6 +1597,69 @@ out: | |||
| 1559 | } | 1597 | } |
| 1560 | 1598 | ||
| 1561 | /** | 1599 | /** |
| 1600 | * e1000_k1_gig_workaround_lv - K1 Si workaround | ||
| 1601 | * @hw: pointer to the HW structure | ||
| 1602 | * | ||
| 1603 | * Workaround to set the K1 beacon duration for 82579 parts | ||
| 1604 | **/ | ||
| 1605 | static s32 e1000_k1_workaround_lv(struct e1000_hw *hw) | ||
| 1606 | { | ||
| 1607 | s32 ret_val = 0; | ||
| 1608 | u16 status_reg = 0; | ||
| 1609 | u32 mac_reg; | ||
| 1610 | |||
| 1611 | if (hw->mac.type != e1000_pch2lan) | ||
| 1612 | goto out; | ||
| 1613 | |||
| 1614 | /* Set K1 beacon duration based on 1Gbps speed or otherwise */ | ||
| 1615 | ret_val = e1e_rphy(hw, HV_M_STATUS, &status_reg); | ||
| 1616 | if (ret_val) | ||
| 1617 | goto out; | ||
| 1618 | |||
| 1619 | if ((status_reg & (HV_M_STATUS_LINK_UP | HV_M_STATUS_AUTONEG_COMPLETE)) | ||
| 1620 | == (HV_M_STATUS_LINK_UP | HV_M_STATUS_AUTONEG_COMPLETE)) { | ||
| 1621 | mac_reg = er32(FEXTNVM4); | ||
| 1622 | mac_reg &= ~E1000_FEXTNVM4_BEACON_DURATION_MASK; | ||
| 1623 | |||
| 1624 | if (status_reg & HV_M_STATUS_SPEED_1000) | ||
| 1625 | mac_reg |= E1000_FEXTNVM4_BEACON_DURATION_8USEC; | ||
| 1626 | else | ||
| 1627 | mac_reg |= E1000_FEXTNVM4_BEACON_DURATION_16USEC; | ||
| 1628 | |||
| 1629 | ew32(FEXTNVM4, mac_reg); | ||
| 1630 | } | ||
| 1631 | |||
| 1632 | out: | ||
| 1633 | return ret_val; | ||
| 1634 | } | ||
| 1635 | |||
| 1636 | /** | ||
| 1637 | * e1000_gate_hw_phy_config_ich8lan - disable PHY config via hardware | ||
| 1638 | * @hw: pointer to the HW structure | ||
| 1639 | * @gate: boolean set to true to gate, false to ungate | ||
| 1640 | * | ||
| 1641 | * Gate/ungate the automatic PHY configuration via hardware; perform | ||
| 1642 | * the configuration via software instead. | ||
| 1643 | **/ | ||
| 1644 | static void e1000_gate_hw_phy_config_ich8lan(struct e1000_hw *hw, bool gate) | ||
| 1645 | { | ||
| 1646 | u32 extcnf_ctrl; | ||
| 1647 | |||
| 1648 | if (hw->mac.type != e1000_pch2lan) | ||
| 1649 | return; | ||
| 1650 | |||
| 1651 | extcnf_ctrl = er32(EXTCNF_CTRL); | ||
| 1652 | |||
| 1653 | if (gate) | ||
| 1654 | extcnf_ctrl |= E1000_EXTCNF_CTRL_GATE_PHY_CFG; | ||
| 1655 | else | ||
| 1656 | extcnf_ctrl &= ~E1000_EXTCNF_CTRL_GATE_PHY_CFG; | ||
| 1657 | |||
| 1658 | ew32(EXTCNF_CTRL, extcnf_ctrl); | ||
| 1659 | return; | ||
| 1660 | } | ||
| 1661 | |||
| 1662 | /** | ||
| 1562 | * e1000_lan_init_done_ich8lan - Check for PHY config completion | 1663 | * e1000_lan_init_done_ich8lan - Check for PHY config completion |
| 1563 | * @hw: pointer to the HW structure | 1664 | * @hw: pointer to the HW structure |
| 1564 | * | 1665 | * |
| @@ -1602,6 +1703,9 @@ static s32 e1000_post_phy_reset_ich8lan(struct e1000_hw *hw) | |||
| 1602 | if (e1000_check_reset_block(hw)) | 1703 | if (e1000_check_reset_block(hw)) |
| 1603 | goto out; | 1704 | goto out; |
| 1604 | 1705 | ||
| 1706 | /* Allow time for h/w to get to quiescent state after reset */ | ||
| 1707 | msleep(10); | ||
| 1708 | |||
| 1605 | /* Perform any necessary post-reset workarounds */ | 1709 | /* Perform any necessary post-reset workarounds */ |
| 1606 | switch (hw->mac.type) { | 1710 | switch (hw->mac.type) { |
| 1607 | case e1000_pchlan: | 1711 | case e1000_pchlan: |
| @@ -1630,6 +1734,13 @@ static s32 e1000_post_phy_reset_ich8lan(struct e1000_hw *hw) | |||
| 1630 | /* Configure the LCD with the OEM bits in NVM */ | 1734 | /* Configure the LCD with the OEM bits in NVM */ |
| 1631 | ret_val = e1000_oem_bits_config_ich8lan(hw, true); | 1735 | ret_val = e1000_oem_bits_config_ich8lan(hw, true); |
| 1632 | 1736 | ||
| 1737 | /* Ungate automatic PHY configuration on non-managed 82579 */ | ||
| 1738 | if ((hw->mac.type == e1000_pch2lan) && | ||
| 1739 | !(er32(FWSM) & E1000_ICH_FWSM_FW_VALID)) { | ||
| 1740 | msleep(10); | ||
| 1741 | e1000_gate_hw_phy_config_ich8lan(hw, false); | ||
| 1742 | } | ||
| 1743 | |||
| 1633 | out: | 1744 | out: |
| 1634 | return ret_val; | 1745 | return ret_val; |
| 1635 | } | 1746 | } |
| @@ -1646,6 +1757,11 @@ static s32 e1000_phy_hw_reset_ich8lan(struct e1000_hw *hw) | |||
| 1646 | { | 1757 | { |
| 1647 | s32 ret_val = 0; | 1758 | s32 ret_val = 0; |
| 1648 | 1759 | ||
| 1760 | /* Gate automatic PHY configuration by hardware on non-managed 82579 */ | ||
| 1761 | if ((hw->mac.type == e1000_pch2lan) && | ||
| 1762 | !(er32(FWSM) & E1000_ICH_FWSM_FW_VALID)) | ||
| 1763 | e1000_gate_hw_phy_config_ich8lan(hw, true); | ||
| 1764 | |||
| 1649 | ret_val = e1000e_phy_hw_reset_generic(hw); | 1765 | ret_val = e1000e_phy_hw_reset_generic(hw); |
| 1650 | if (ret_val) | 1766 | if (ret_val) |
| 1651 | goto out; | 1767 | goto out; |
| @@ -2910,6 +3026,14 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw) | |||
| 2910 | * external PHY is reset. | 3026 | * external PHY is reset. |
| 2911 | */ | 3027 | */ |
| 2912 | ctrl |= E1000_CTRL_PHY_RST; | 3028 | ctrl |= E1000_CTRL_PHY_RST; |
| 3029 | |||
| 3030 | /* | ||
| 3031 | * Gate automatic PHY configuration by hardware on | ||
| 3032 | * non-managed 82579 | ||
| 3033 | */ | ||
| 3034 | if ((hw->mac.type == e1000_pch2lan) && | ||
| 3035 | !(er32(FWSM) & E1000_ICH_FWSM_FW_VALID)) | ||
| 3036 | e1000_gate_hw_phy_config_ich8lan(hw, true); | ||
| 2913 | } | 3037 | } |
| 2914 | ret_val = e1000_acquire_swflag_ich8lan(hw); | 3038 | ret_val = e1000_acquire_swflag_ich8lan(hw); |
| 2915 | e_dbg("Issuing a global reset to ich8lan\n"); | 3039 | e_dbg("Issuing a global reset to ich8lan\n"); |
| @@ -3460,13 +3584,20 @@ void e1000e_gig_downshift_workaround_ich8lan(struct e1000_hw *hw) | |||
| 3460 | void e1000e_disable_gig_wol_ich8lan(struct e1000_hw *hw) | 3584 | void e1000e_disable_gig_wol_ich8lan(struct e1000_hw *hw) |
| 3461 | { | 3585 | { |
| 3462 | u32 phy_ctrl; | 3586 | u32 phy_ctrl; |
| 3587 | s32 ret_val; | ||
| 3463 | 3588 | ||
| 3464 | phy_ctrl = er32(PHY_CTRL); | 3589 | phy_ctrl = er32(PHY_CTRL); |
| 3465 | phy_ctrl |= E1000_PHY_CTRL_D0A_LPLU | E1000_PHY_CTRL_GBE_DISABLE; | 3590 | phy_ctrl |= E1000_PHY_CTRL_D0A_LPLU | E1000_PHY_CTRL_GBE_DISABLE; |
| 3466 | ew32(PHY_CTRL, phy_ctrl); | 3591 | ew32(PHY_CTRL, phy_ctrl); |
| 3467 | 3592 | ||
| 3468 | if (hw->mac.type >= e1000_pchlan) | 3593 | if (hw->mac.type >= e1000_pchlan) { |
| 3469 | e1000_phy_hw_reset_ich8lan(hw); | 3594 | e1000_oem_bits_config_ich8lan(hw, true); |
| 3595 | ret_val = hw->phy.ops.acquire(hw); | ||
| 3596 | if (ret_val) | ||
| 3597 | return; | ||
| 3598 | e1000_write_smbus_addr(hw); | ||
| 3599 | hw->phy.ops.release(hw); | ||
| 3600 | } | ||
| 3470 | } | 3601 | } |
| 3471 | 3602 | ||
| 3472 | /** | 3603 | /** |
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index 2b8ef44bd2b1..e561d15c3eb1 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
| @@ -2704,6 +2704,16 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter) | |||
| 2704 | u32 psrctl = 0; | 2704 | u32 psrctl = 0; |
| 2705 | u32 pages = 0; | 2705 | u32 pages = 0; |
| 2706 | 2706 | ||
| 2707 | /* Workaround Si errata on 82579 - configure jumbo frame flow */ | ||
| 2708 | if (hw->mac.type == e1000_pch2lan) { | ||
| 2709 | s32 ret_val; | ||
| 2710 | |||
| 2711 | if (adapter->netdev->mtu > ETH_DATA_LEN) | ||
| 2712 | ret_val = e1000_lv_jumbo_workaround_ich8lan(hw, true); | ||
| 2713 | else | ||
| 2714 | ret_val = e1000_lv_jumbo_workaround_ich8lan(hw, false); | ||
| 2715 | } | ||
| 2716 | |||
| 2707 | /* Program MC offset vector base */ | 2717 | /* Program MC offset vector base */ |
| 2708 | rctl = er32(RCTL); | 2718 | rctl = er32(RCTL); |
| 2709 | rctl &= ~(3 << E1000_RCTL_MO_SHIFT); | 2719 | rctl &= ~(3 << E1000_RCTL_MO_SHIFT); |
| @@ -2744,16 +2754,6 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter) | |||
| 2744 | e1e_wphy(hw, 22, phy_data); | 2754 | e1e_wphy(hw, 22, phy_data); |
| 2745 | } | 2755 | } |
| 2746 | 2756 | ||
| 2747 | /* Workaround Si errata on 82579 - configure jumbo frame flow */ | ||
| 2748 | if (hw->mac.type == e1000_pch2lan) { | ||
| 2749 | s32 ret_val; | ||
| 2750 | |||
| 2751 | if (rctl & E1000_RCTL_LPE) | ||
| 2752 | ret_val = e1000_lv_jumbo_workaround_ich8lan(hw, true); | ||
| 2753 | else | ||
| 2754 | ret_val = e1000_lv_jumbo_workaround_ich8lan(hw, false); | ||
| 2755 | } | ||
| 2756 | |||
| 2757 | /* Setup buffer sizes */ | 2757 | /* Setup buffer sizes */ |
| 2758 | rctl &= ~E1000_RCTL_SZ_4096; | 2758 | rctl &= ~E1000_RCTL_SZ_4096; |
| 2759 | rctl |= E1000_RCTL_BSEX; | 2759 | rctl |= E1000_RCTL_BSEX; |
| @@ -4833,6 +4833,15 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu) | |||
| 4833 | return -EINVAL; | 4833 | return -EINVAL; |
| 4834 | } | 4834 | } |
| 4835 | 4835 | ||
| 4836 | /* Jumbo frame workaround on 82579 requires CRC be stripped */ | ||
| 4837 | if ((adapter->hw.mac.type == e1000_pch2lan) && | ||
| 4838 | !(adapter->flags2 & FLAG2_CRC_STRIPPING) && | ||
| 4839 | (new_mtu > ETH_DATA_LEN)) { | ||
| 4840 | e_err("Jumbo Frames not supported on 82579 when CRC " | ||
| 4841 | "stripping is disabled.\n"); | ||
| 4842 | return -EINVAL; | ||
| 4843 | } | ||
| 4844 | |||
| 4836 | /* 82573 Errata 17 */ | 4845 | /* 82573 Errata 17 */ |
| 4837 | if (((adapter->hw.mac.type == e1000_82573) || | 4846 | if (((adapter->hw.mac.type == e1000_82573) || |
| 4838 | (adapter->hw.mac.type == e1000_82574)) && | 4847 | (adapter->hw.mac.type == e1000_82574)) && |
diff --git a/drivers/net/eql.c b/drivers/net/eql.c index dda2c7944da9..0cb1cf9cf4b0 100644 --- a/drivers/net/eql.c +++ b/drivers/net/eql.c | |||
| @@ -555,6 +555,8 @@ static int eql_g_master_cfg(struct net_device *dev, master_config_t __user *mcp) | |||
| 555 | equalizer_t *eql; | 555 | equalizer_t *eql; |
| 556 | master_config_t mc; | 556 | master_config_t mc; |
| 557 | 557 | ||
| 558 | memset(&mc, 0, sizeof(master_config_t)); | ||
| 559 | |||
| 558 | if (eql_is_master(dev)) { | 560 | if (eql_is_master(dev)) { |
| 559 | eql = netdev_priv(dev); | 561 | eql = netdev_priv(dev); |
| 560 | mc.max_slaves = eql->max_slaves; | 562 | mc.max_slaves = eql->max_slaves; |
diff --git a/drivers/net/ibm_newemac/core.c b/drivers/net/ibm_newemac/core.c index 3506fd6ad726..519e19e23955 100644 --- a/drivers/net/ibm_newemac/core.c +++ b/drivers/net/ibm_newemac/core.c | |||
| @@ -2928,7 +2928,7 @@ static int __devinit emac_probe(struct platform_device *ofdev, | |||
| 2928 | if (dev->emac_irq != NO_IRQ) | 2928 | if (dev->emac_irq != NO_IRQ) |
| 2929 | irq_dispose_mapping(dev->emac_irq); | 2929 | irq_dispose_mapping(dev->emac_irq); |
| 2930 | err_free: | 2930 | err_free: |
| 2931 | kfree(ndev); | 2931 | free_netdev(ndev); |
| 2932 | err_gone: | 2932 | err_gone: |
| 2933 | /* if we were on the bootlist, remove us as we won't show up and | 2933 | /* if we were on the bootlist, remove us as we won't show up and |
| 2934 | * wake up all waiters to notify them in case they were waiting | 2934 | * wake up all waiters to notify them in case they were waiting |
| @@ -2971,7 +2971,7 @@ static int __devexit emac_remove(struct platform_device *ofdev) | |||
| 2971 | if (dev->emac_irq != NO_IRQ) | 2971 | if (dev->emac_irq != NO_IRQ) |
| 2972 | irq_dispose_mapping(dev->emac_irq); | 2972 | irq_dispose_mapping(dev->emac_irq); |
| 2973 | 2973 | ||
| 2974 | kfree(dev->ndev); | 2974 | free_netdev(dev->ndev); |
| 2975 | 2975 | ||
| 2976 | return 0; | 2976 | return 0; |
| 2977 | } | 2977 | } |
diff --git a/drivers/net/ks8851.c b/drivers/net/ks8851.c index b4fb07a6f13f..51919fcd50c2 100644 --- a/drivers/net/ks8851.c +++ b/drivers/net/ks8851.c | |||
| @@ -503,30 +503,33 @@ static void ks8851_rx_pkts(struct ks8851_net *ks) | |||
| 503 | ks8851_wrreg16(ks, KS_RXQCR, | 503 | ks8851_wrreg16(ks, KS_RXQCR, |
| 504 | ks->rc_rxqcr | RXQCR_SDA | RXQCR_ADRFE); | 504 | ks->rc_rxqcr | RXQCR_SDA | RXQCR_ADRFE); |
| 505 | 505 | ||
| 506 | if (rxlen > 0) { | 506 | if (rxlen > 4) { |
| 507 | skb = netdev_alloc_skb(ks->netdev, rxlen + 2 + 8); | 507 | unsigned int rxalign; |
| 508 | if (!skb) { | 508 | |
| 509 | /* todo - dump frame and move on */ | 509 | rxlen -= 4; |
| 510 | } | 510 | rxalign = ALIGN(rxlen, 4); |
| 511 | skb = netdev_alloc_skb_ip_align(ks->netdev, rxalign); | ||
| 512 | if (skb) { | ||
| 511 | 513 | ||
| 512 | /* two bytes to ensure ip is aligned, and four bytes | 514 | /* 4 bytes of status header + 4 bytes of |
| 513 | * for the status header and 4 bytes of garbage */ | 515 | * garbage: we put them before ethernet |
| 514 | skb_reserve(skb, 2 + 4 + 4); | 516 | * header, so that they are copied, |
| 517 | * but ignored. | ||
| 518 | */ | ||
| 515 | 519 | ||
| 516 | rxpkt = skb_put(skb, rxlen - 4) - 8; | 520 | rxpkt = skb_put(skb, rxlen) - 8; |
| 517 | 521 | ||
| 518 | /* align the packet length to 4 bytes, and add 4 bytes | 522 | ks8851_rdfifo(ks, rxpkt, rxalign + 8); |
| 519 | * as we're getting the rx status header as well */ | ||
| 520 | ks8851_rdfifo(ks, rxpkt, ALIGN(rxlen, 4) + 8); | ||
| 521 | 523 | ||
| 522 | if (netif_msg_pktdata(ks)) | 524 | if (netif_msg_pktdata(ks)) |
| 523 | ks8851_dbg_dumpkkt(ks, rxpkt); | 525 | ks8851_dbg_dumpkkt(ks, rxpkt); |
| 524 | 526 | ||
| 525 | skb->protocol = eth_type_trans(skb, ks->netdev); | 527 | skb->protocol = eth_type_trans(skb, ks->netdev); |
| 526 | netif_rx(skb); | 528 | netif_rx(skb); |
| 527 | 529 | ||
| 528 | ks->netdev->stats.rx_packets++; | 530 | ks->netdev->stats.rx_packets++; |
| 529 | ks->netdev->stats.rx_bytes += rxlen - 4; | 531 | ks->netdev->stats.rx_bytes += rxlen; |
| 532 | } | ||
| 530 | } | 533 | } |
| 531 | 534 | ||
| 532 | ks8851_wrreg16(ks, KS_RXQCR, ks->rc_rxqcr); | 535 | ks8851_wrreg16(ks, KS_RXQCR, ks->rc_rxqcr); |
diff --git a/drivers/net/ll_temac_main.c b/drivers/net/ll_temac_main.c index bdf2149e5296..87f0a93b165c 100644 --- a/drivers/net/ll_temac_main.c +++ b/drivers/net/ll_temac_main.c | |||
| @@ -38,6 +38,7 @@ | |||
| 38 | #include <linux/of_device.h> | 38 | #include <linux/of_device.h> |
| 39 | #include <linux/of_mdio.h> | 39 | #include <linux/of_mdio.h> |
| 40 | #include <linux/of_platform.h> | 40 | #include <linux/of_platform.h> |
| 41 | #include <linux/of_address.h> | ||
| 41 | #include <linux/skbuff.h> | 42 | #include <linux/skbuff.h> |
| 42 | #include <linux/spinlock.h> | 43 | #include <linux/spinlock.h> |
| 43 | #include <linux/tcp.h> /* needed for sizeof(tcphdr) */ | 44 | #include <linux/tcp.h> /* needed for sizeof(tcphdr) */ |
diff --git a/drivers/net/ll_temac_mdio.c b/drivers/net/ll_temac_mdio.c index 5ae28c975b38..8cf9d4f56bb2 100644 --- a/drivers/net/ll_temac_mdio.c +++ b/drivers/net/ll_temac_mdio.c | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #include <linux/phy.h> | 10 | #include <linux/phy.h> |
| 11 | #include <linux/of.h> | 11 | #include <linux/of.h> |
| 12 | #include <linux/of_device.h> | 12 | #include <linux/of_device.h> |
| 13 | #include <linux/of_address.h> | ||
| 13 | #include <linux/slab.h> | 14 | #include <linux/slab.h> |
| 14 | #include <linux/of_mdio.h> | 15 | #include <linux/of_mdio.h> |
| 15 | 16 | ||
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c index cabae7bb1fc6..b075a35b85d4 100644 --- a/drivers/net/netxen/netxen_nic_init.c +++ b/drivers/net/netxen/netxen_nic_init.c | |||
| @@ -1540,7 +1540,6 @@ netxen_process_rcv(struct netxen_adapter *adapter, | |||
| 1540 | if (pkt_offset) | 1540 | if (pkt_offset) |
| 1541 | skb_pull(skb, pkt_offset); | 1541 | skb_pull(skb, pkt_offset); |
| 1542 | 1542 | ||
| 1543 | skb->truesize = skb->len + sizeof(struct sk_buff); | ||
| 1544 | skb->protocol = eth_type_trans(skb, netdev); | 1543 | skb->protocol = eth_type_trans(skb, netdev); |
| 1545 | 1544 | ||
| 1546 | napi_gro_receive(&sds_ring->napi, skb); | 1545 | napi_gro_receive(&sds_ring->napi, skb); |
| @@ -1602,8 +1601,6 @@ netxen_process_lro(struct netxen_adapter *adapter, | |||
| 1602 | 1601 | ||
| 1603 | skb_put(skb, lro_length + data_offset); | 1602 | skb_put(skb, lro_length + data_offset); |
| 1604 | 1603 | ||
| 1605 | skb->truesize = skb->len + sizeof(struct sk_buff) + skb_headroom(skb); | ||
| 1606 | |||
| 1607 | skb_pull(skb, l2_hdr_offset); | 1604 | skb_pull(skb, l2_hdr_offset); |
| 1608 | skb->protocol = eth_type_trans(skb, netdev); | 1605 | skb->protocol = eth_type_trans(skb, netdev); |
| 1609 | 1606 | ||
diff --git a/drivers/net/niu.c b/drivers/net/niu.c index bc695d53cdcc..fe6983af6918 100644 --- a/drivers/net/niu.c +++ b/drivers/net/niu.c | |||
| @@ -7269,32 +7269,28 @@ static int niu_get_ethtool_tcam_all(struct niu *np, | |||
| 7269 | struct niu_parent *parent = np->parent; | 7269 | struct niu_parent *parent = np->parent; |
| 7270 | struct niu_tcam_entry *tp; | 7270 | struct niu_tcam_entry *tp; |
| 7271 | int i, idx, cnt; | 7271 | int i, idx, cnt; |
| 7272 | u16 n_entries; | ||
| 7273 | unsigned long flags; | 7272 | unsigned long flags; |
| 7274 | 7273 | int ret = 0; | |
| 7275 | 7274 | ||
| 7276 | /* put the tcam size here */ | 7275 | /* put the tcam size here */ |
| 7277 | nfc->data = tcam_get_size(np); | 7276 | nfc->data = tcam_get_size(np); |
| 7278 | 7277 | ||
| 7279 | niu_lock_parent(np, flags); | 7278 | niu_lock_parent(np, flags); |
| 7280 | n_entries = nfc->rule_cnt; | ||
| 7281 | for (cnt = 0, i = 0; i < nfc->data; i++) { | 7279 | for (cnt = 0, i = 0; i < nfc->data; i++) { |
| 7282 | idx = tcam_get_index(np, i); | 7280 | idx = tcam_get_index(np, i); |
| 7283 | tp = &parent->tcam[idx]; | 7281 | tp = &parent->tcam[idx]; |
| 7284 | if (!tp->valid) | 7282 | if (!tp->valid) |
| 7285 | continue; | 7283 | continue; |
| 7284 | if (cnt == nfc->rule_cnt) { | ||
| 7285 | ret = -EMSGSIZE; | ||
| 7286 | break; | ||
| 7287 | } | ||
| 7286 | rule_locs[cnt] = i; | 7288 | rule_locs[cnt] = i; |
| 7287 | cnt++; | 7289 | cnt++; |
| 7288 | } | 7290 | } |
| 7289 | niu_unlock_parent(np, flags); | 7291 | niu_unlock_parent(np, flags); |
| 7290 | 7292 | ||
| 7291 | if (n_entries != cnt) { | 7293 | return ret; |
| 7292 | /* print warning, this should not happen */ | ||
| 7293 | netdev_info(np->dev, "niu%d: In %s(): n_entries[%d] != cnt[%d]!!!\n", | ||
| 7294 | np->parent->index, __func__, n_entries, cnt); | ||
| 7295 | } | ||
| 7296 | |||
| 7297 | return 0; | ||
| 7298 | } | 7294 | } |
| 7299 | 7295 | ||
| 7300 | static int niu_get_nfc(struct net_device *dev, struct ethtool_rxnfc *cmd, | 7296 | static int niu_get_nfc(struct net_device *dev, struct ethtool_rxnfc *cmd, |
diff --git a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c index 49279b0ee526..f9b509a6b09a 100644 --- a/drivers/net/pcmcia/pcnet_cs.c +++ b/drivers/net/pcmcia/pcnet_cs.c | |||
| @@ -508,7 +508,8 @@ static int pcnet_confcheck(struct pcmcia_device *p_dev, | |||
| 508 | unsigned int vcc, | 508 | unsigned int vcc, |
| 509 | void *priv_data) | 509 | void *priv_data) |
| 510 | { | 510 | { |
| 511 | int *has_shmem = priv_data; | 511 | int *priv = priv_data; |
| 512 | int try = (*priv & 0x1); | ||
| 512 | int i; | 513 | int i; |
| 513 | cistpl_io_t *io = &cfg->io; | 514 | cistpl_io_t *io = &cfg->io; |
| 514 | 515 | ||
| @@ -525,77 +526,103 @@ static int pcnet_confcheck(struct pcmcia_device *p_dev, | |||
| 525 | i = p_dev->resource[1]->end = 0; | 526 | i = p_dev->resource[1]->end = 0; |
| 526 | } | 527 | } |
| 527 | 528 | ||
| 528 | *has_shmem = ((cfg->mem.nwin == 1) && | 529 | *priv &= ((cfg->mem.nwin == 1) && |
| 529 | (cfg->mem.win[0].len >= 0x4000)); | 530 | (cfg->mem.win[0].len >= 0x4000)) ? 0x10 : ~0x10; |
| 531 | |||
| 530 | p_dev->resource[0]->start = io->win[i].base; | 532 | p_dev->resource[0]->start = io->win[i].base; |
| 531 | p_dev->resource[0]->end = io->win[i].len; | 533 | p_dev->resource[0]->end = io->win[i].len; |
| 532 | p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK; | 534 | if (!try) |
| 535 | p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK; | ||
| 536 | else | ||
| 537 | p_dev->io_lines = 16; | ||
| 533 | if (p_dev->resource[0]->end + p_dev->resource[1]->end >= 32) | 538 | if (p_dev->resource[0]->end + p_dev->resource[1]->end >= 32) |
| 534 | return try_io_port(p_dev); | 539 | return try_io_port(p_dev); |
| 535 | 540 | ||
| 536 | return 0; | 541 | return -EINVAL; |
| 542 | } | ||
| 543 | |||
| 544 | static hw_info_t *pcnet_try_config(struct pcmcia_device *link, | ||
| 545 | int *has_shmem, int try) | ||
| 546 | { | ||
| 547 | struct net_device *dev = link->priv; | ||
| 548 | hw_info_t *local_hw_info; | ||
| 549 | pcnet_dev_t *info = PRIV(dev); | ||
| 550 | int priv = try; | ||
| 551 | int ret; | ||
| 552 | |||
| 553 | ret = pcmcia_loop_config(link, pcnet_confcheck, &priv); | ||
| 554 | if (ret) { | ||
| 555 | dev_warn(&link->dev, "no useable port range found\n"); | ||
| 556 | return NULL; | ||
| 557 | } | ||
| 558 | *has_shmem = (priv & 0x10); | ||
| 559 | |||
| 560 | if (!link->irq) | ||
| 561 | return NULL; | ||
| 562 | |||
| 563 | if (resource_size(link->resource[1]) == 8) { | ||
| 564 | link->conf.Attributes |= CONF_ENABLE_SPKR; | ||
| 565 | link->conf.Status = CCSR_AUDIO_ENA; | ||
| 566 | } | ||
| 567 | if ((link->manf_id == MANFID_IBM) && | ||
| 568 | (link->card_id == PRODID_IBM_HOME_AND_AWAY)) | ||
| 569 | link->conf.ConfigIndex |= 0x10; | ||
| 570 | |||
| 571 | ret = pcmcia_request_configuration(link, &link->conf); | ||
| 572 | if (ret) | ||
| 573 | return NULL; | ||
| 574 | |||
| 575 | dev->irq = link->irq; | ||
| 576 | dev->base_addr = link->resource[0]->start; | ||
| 577 | |||
| 578 | if (info->flags & HAS_MISC_REG) { | ||
| 579 | if ((if_port == 1) || (if_port == 2)) | ||
| 580 | dev->if_port = if_port; | ||
| 581 | else | ||
| 582 | dev_notice(&link->dev, "invalid if_port requested\n"); | ||
| 583 | } else | ||
| 584 | dev->if_port = 0; | ||
| 585 | |||
| 586 | if ((link->conf.ConfigBase == 0x03c0) && | ||
| 587 | (link->manf_id == 0x149) && (link->card_id == 0xc1ab)) { | ||
| 588 | dev_info(&link->dev, | ||
| 589 | "this is an AX88190 card - use axnet_cs instead.\n"); | ||
| 590 | return NULL; | ||
| 591 | } | ||
| 592 | |||
| 593 | local_hw_info = get_hwinfo(link); | ||
| 594 | if (!local_hw_info) | ||
| 595 | local_hw_info = get_prom(link); | ||
| 596 | if (!local_hw_info) | ||
| 597 | local_hw_info = get_dl10019(link); | ||
| 598 | if (!local_hw_info) | ||
| 599 | local_hw_info = get_ax88190(link); | ||
| 600 | if (!local_hw_info) | ||
| 601 | local_hw_info = get_hwired(link); | ||
| 602 | |||
| 603 | return local_hw_info; | ||
| 537 | } | 604 | } |
| 538 | 605 | ||
| 539 | static int pcnet_config(struct pcmcia_device *link) | 606 | static int pcnet_config(struct pcmcia_device *link) |
| 540 | { | 607 | { |
| 541 | struct net_device *dev = link->priv; | 608 | struct net_device *dev = link->priv; |
| 542 | pcnet_dev_t *info = PRIV(dev); | 609 | pcnet_dev_t *info = PRIV(dev); |
| 543 | int ret, start_pg, stop_pg, cm_offset; | 610 | int start_pg, stop_pg, cm_offset; |
| 544 | int has_shmem = 0; | 611 | int has_shmem = 0; |
| 545 | hw_info_t *local_hw_info; | 612 | hw_info_t *local_hw_info; |
| 546 | 613 | ||
| 547 | dev_dbg(&link->dev, "pcnet_config\n"); | 614 | dev_dbg(&link->dev, "pcnet_config\n"); |
| 548 | 615 | ||
| 549 | ret = pcmcia_loop_config(link, pcnet_confcheck, &has_shmem); | 616 | local_hw_info = pcnet_try_config(link, &has_shmem, 0); |
| 550 | if (ret) | 617 | if (!local_hw_info) { |
| 551 | goto failed; | 618 | /* check whether forcing io_lines to 16 helps... */ |
| 552 | 619 | pcmcia_disable_device(link); | |
| 553 | if (!link->irq) | 620 | local_hw_info = pcnet_try_config(link, &has_shmem, 1); |
| 554 | goto failed; | 621 | if (local_hw_info == NULL) { |
| 555 | 622 | dev_notice(&link->dev, "unable to read hardware net" | |
| 556 | if (resource_size(link->resource[1]) == 8) { | 623 | " address for io base %#3lx\n", dev->base_addr); |
| 557 | link->conf.Attributes |= CONF_ENABLE_SPKR; | 624 | goto failed; |
| 558 | link->conf.Status = CCSR_AUDIO_ENA; | 625 | } |
| 559 | } | ||
| 560 | if ((link->manf_id == MANFID_IBM) && | ||
| 561 | (link->card_id == PRODID_IBM_HOME_AND_AWAY)) | ||
| 562 | link->conf.ConfigIndex |= 0x10; | ||
| 563 | |||
| 564 | ret = pcmcia_request_configuration(link, &link->conf); | ||
| 565 | if (ret) | ||
| 566 | goto failed; | ||
| 567 | dev->irq = link->irq; | ||
| 568 | dev->base_addr = link->resource[0]->start; | ||
| 569 | if (info->flags & HAS_MISC_REG) { | ||
| 570 | if ((if_port == 1) || (if_port == 2)) | ||
| 571 | dev->if_port = if_port; | ||
| 572 | else | ||
| 573 | printk(KERN_NOTICE "pcnet_cs: invalid if_port requested\n"); | ||
| 574 | } else { | ||
| 575 | dev->if_port = 0; | ||
| 576 | } | ||
| 577 | |||
| 578 | if ((link->conf.ConfigBase == 0x03c0) && | ||
| 579 | (link->manf_id == 0x149) && (link->card_id == 0xc1ab)) { | ||
| 580 | printk(KERN_INFO "pcnet_cs: this is an AX88190 card!\n"); | ||
| 581 | printk(KERN_INFO "pcnet_cs: use axnet_cs instead.\n"); | ||
| 582 | goto failed; | ||
| 583 | } | ||
| 584 | |||
| 585 | local_hw_info = get_hwinfo(link); | ||
| 586 | if (local_hw_info == NULL) | ||
| 587 | local_hw_info = get_prom(link); | ||
| 588 | if (local_hw_info == NULL) | ||
| 589 | local_hw_info = get_dl10019(link); | ||
| 590 | if (local_hw_info == NULL) | ||
| 591 | local_hw_info = get_ax88190(link); | ||
| 592 | if (local_hw_info == NULL) | ||
| 593 | local_hw_info = get_hwired(link); | ||
| 594 | |||
| 595 | if (local_hw_info == NULL) { | ||
| 596 | printk(KERN_NOTICE "pcnet_cs: unable to read hardware net" | ||
| 597 | " address for io base %#3lx\n", dev->base_addr); | ||
| 598 | goto failed; | ||
| 599 | } | 626 | } |
| 600 | 627 | ||
| 601 | info->flags = local_hw_info->flags; | 628 | info->flags = local_hw_info->flags; |
diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c index 6a6b8199a0d6..6c58da2b882c 100644 --- a/drivers/net/phy/mdio_bus.c +++ b/drivers/net/phy/mdio_bus.c | |||
| @@ -308,7 +308,7 @@ static int mdio_bus_suspend(struct device *dev) | |||
| 308 | * may call phy routines that try to grab the same lock, and that may | 308 | * may call phy routines that try to grab the same lock, and that may |
| 309 | * lead to a deadlock. | 309 | * lead to a deadlock. |
| 310 | */ | 310 | */ |
| 311 | if (phydev->attached_dev) | 311 | if (phydev->attached_dev && phydev->adjust_link) |
| 312 | phy_stop_machine(phydev); | 312 | phy_stop_machine(phydev); |
| 313 | 313 | ||
| 314 | if (!mdio_bus_phy_may_suspend(phydev)) | 314 | if (!mdio_bus_phy_may_suspend(phydev)) |
| @@ -331,7 +331,7 @@ static int mdio_bus_resume(struct device *dev) | |||
| 331 | return ret; | 331 | return ret; |
| 332 | 332 | ||
| 333 | no_resume: | 333 | no_resume: |
| 334 | if (phydev->attached_dev) | 334 | if (phydev->attached_dev && phydev->adjust_link) |
| 335 | phy_start_machine(phydev, NULL); | 335 | phy_start_machine(phydev, NULL); |
| 336 | 336 | ||
| 337 | return 0; | 337 | return 0; |
diff --git a/drivers/net/ppp_generic.c b/drivers/net/ppp_generic.c index 6695a51e09e9..736b91703b3e 100644 --- a/drivers/net/ppp_generic.c +++ b/drivers/net/ppp_generic.c | |||
| @@ -1314,8 +1314,13 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb) | |||
| 1314 | hdrlen = (ppp->flags & SC_MP_XSHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN; | 1314 | hdrlen = (ppp->flags & SC_MP_XSHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN; |
| 1315 | i = 0; | 1315 | i = 0; |
| 1316 | list_for_each_entry(pch, &ppp->channels, clist) { | 1316 | list_for_each_entry(pch, &ppp->channels, clist) { |
| 1317 | navail += pch->avail = (pch->chan != NULL); | 1317 | if (pch->chan) { |
| 1318 | pch->speed = pch->chan->speed; | 1318 | pch->avail = 1; |
| 1319 | navail++; | ||
| 1320 | pch->speed = pch->chan->speed; | ||
| 1321 | } else { | ||
| 1322 | pch->avail = 0; | ||
| 1323 | } | ||
| 1319 | if (pch->avail) { | 1324 | if (pch->avail) { |
| 1320 | if (skb_queue_empty(&pch->file.xq) || | 1325 | if (skb_queue_empty(&pch->file.xq) || |
| 1321 | !pch->had_frag) { | 1326 | !pch->had_frag) { |
diff --git a/drivers/net/qlcnic/qlcnic_init.c b/drivers/net/qlcnic/qlcnic_init.c index 75ba744b173c..2c7cf0b64811 100644 --- a/drivers/net/qlcnic/qlcnic_init.c +++ b/drivers/net/qlcnic/qlcnic_init.c | |||
| @@ -1316,7 +1316,7 @@ qlcnic_alloc_rx_skb(struct qlcnic_adapter *adapter, | |||
| 1316 | return -ENOMEM; | 1316 | return -ENOMEM; |
| 1317 | } | 1317 | } |
| 1318 | 1318 | ||
| 1319 | skb_reserve(skb, 2); | 1319 | skb_reserve(skb, NET_IP_ALIGN); |
| 1320 | 1320 | ||
| 1321 | dma = pci_map_single(pdev, skb->data, | 1321 | dma = pci_map_single(pdev, skb->data, |
| 1322 | rds_ring->dma_size, PCI_DMA_FROMDEVICE); | 1322 | rds_ring->dma_size, PCI_DMA_FROMDEVICE); |
| @@ -1404,7 +1404,6 @@ qlcnic_process_rcv(struct qlcnic_adapter *adapter, | |||
| 1404 | if (pkt_offset) | 1404 | if (pkt_offset) |
| 1405 | skb_pull(skb, pkt_offset); | 1405 | skb_pull(skb, pkt_offset); |
| 1406 | 1406 | ||
| 1407 | skb->truesize = skb->len + sizeof(struct sk_buff); | ||
| 1408 | skb->protocol = eth_type_trans(skb, netdev); | 1407 | skb->protocol = eth_type_trans(skb, netdev); |
| 1409 | 1408 | ||
| 1410 | napi_gro_receive(&sds_ring->napi, skb); | 1409 | napi_gro_receive(&sds_ring->napi, skb); |
| @@ -1466,8 +1465,6 @@ qlcnic_process_lro(struct qlcnic_adapter *adapter, | |||
| 1466 | 1465 | ||
| 1467 | skb_put(skb, lro_length + data_offset); | 1466 | skb_put(skb, lro_length + data_offset); |
| 1468 | 1467 | ||
| 1469 | skb->truesize = skb->len + sizeof(struct sk_buff) + skb_headroom(skb); | ||
| 1470 | |||
| 1471 | skb_pull(skb, l2_hdr_offset); | 1468 | skb_pull(skb, l2_hdr_offset); |
| 1472 | skb->protocol = eth_type_trans(skb, netdev); | 1469 | skb->protocol = eth_type_trans(skb, netdev); |
| 1473 | 1470 | ||
| @@ -1700,8 +1697,6 @@ qlcnic_process_rcv_diag(struct qlcnic_adapter *adapter, | |||
| 1700 | if (pkt_offset) | 1697 | if (pkt_offset) |
| 1701 | skb_pull(skb, pkt_offset); | 1698 | skb_pull(skb, pkt_offset); |
| 1702 | 1699 | ||
| 1703 | skb->truesize = skb->len + sizeof(struct sk_buff); | ||
| 1704 | |||
| 1705 | if (!qlcnic_check_loopback_buff(skb->data)) | 1700 | if (!qlcnic_check_loopback_buff(skb->data)) |
| 1706 | adapter->diag_cnt++; | 1701 | adapter->diag_cnt++; |
| 1707 | 1702 | ||
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index 078bbf4e6f19..a0da4a17b025 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
| @@ -2934,7 +2934,7 @@ static const struct rtl_cfg_info { | |||
| 2934 | .hw_start = rtl_hw_start_8168, | 2934 | .hw_start = rtl_hw_start_8168, |
| 2935 | .region = 2, | 2935 | .region = 2, |
| 2936 | .align = 8, | 2936 | .align = 8, |
| 2937 | .intr_event = SYSErr | LinkChg | RxOverflow | | 2937 | .intr_event = SYSErr | RxFIFOOver | LinkChg | RxOverflow | |
| 2938 | TxErr | TxOK | RxOK | RxErr, | 2938 | TxErr | TxOK | RxOK | RxErr, |
| 2939 | .napi_event = TxErr | TxOK | RxOK | RxOverflow, | 2939 | .napi_event = TxErr | TxOK | RxOK | RxOverflow, |
| 2940 | .features = RTL_FEATURE_GMII | RTL_FEATURE_MSI, | 2940 | .features = RTL_FEATURE_GMII | RTL_FEATURE_MSI, |
| @@ -4625,8 +4625,7 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance) | |||
| 4625 | } | 4625 | } |
| 4626 | 4626 | ||
| 4627 | /* Work around for rx fifo overflow */ | 4627 | /* Work around for rx fifo overflow */ |
| 4628 | if (unlikely(status & RxFIFOOver) && | 4628 | if (unlikely(status & RxFIFOOver)) { |
| 4629 | (tp->mac_version == RTL_GIGA_MAC_VER_11)) { | ||
| 4630 | netif_stop_queue(dev); | 4629 | netif_stop_queue(dev); |
| 4631 | rtl8169_tx_timeout(dev); | 4630 | rtl8169_tx_timeout(dev); |
| 4632 | break; | 4631 | break; |
diff --git a/drivers/net/rionet.c b/drivers/net/rionet.c index 07eb884ff982..44150f2f7bfd 100644 --- a/drivers/net/rionet.c +++ b/drivers/net/rionet.c | |||
| @@ -384,7 +384,7 @@ static void rionet_remove(struct rio_dev *rdev) | |||
| 384 | free_pages((unsigned long)rionet_active, rdev->net->hport->sys_size ? | 384 | free_pages((unsigned long)rionet_active, rdev->net->hport->sys_size ? |
| 385 | __ilog2(sizeof(void *)) + 4 : 0); | 385 | __ilog2(sizeof(void *)) + 4 : 0); |
| 386 | unregister_netdev(ndev); | 386 | unregister_netdev(ndev); |
| 387 | kfree(ndev); | 387 | free_netdev(ndev); |
| 388 | 388 | ||
| 389 | list_for_each_entry_safe(peer, tmp, &rionet_peers, node) { | 389 | list_for_each_entry_safe(peer, tmp, &rionet_peers, node) { |
| 390 | list_del(&peer->node); | 390 | list_del(&peer->node); |
diff --git a/drivers/net/sgiseeq.c b/drivers/net/sgiseeq.c index cc4bd8c65f8b..9265315baa0b 100644 --- a/drivers/net/sgiseeq.c +++ b/drivers/net/sgiseeq.c | |||
| @@ -804,7 +804,7 @@ static int __devinit sgiseeq_probe(struct platform_device *pdev) | |||
| 804 | err_out_free_page: | 804 | err_out_free_page: |
| 805 | free_page((unsigned long) sp->srings); | 805 | free_page((unsigned long) sp->srings); |
| 806 | err_out_free_dev: | 806 | err_out_free_dev: |
| 807 | kfree(dev); | 807 | free_netdev(dev); |
| 808 | 808 | ||
| 809 | err_out: | 809 | err_out: |
| 810 | return err; | 810 | return err; |
diff --git a/drivers/net/smsc911x.c b/drivers/net/smsc911x.c index 0909ae934ad0..8150ba154116 100644 --- a/drivers/net/smsc911x.c +++ b/drivers/net/smsc911x.c | |||
| @@ -58,6 +58,7 @@ | |||
| 58 | 58 | ||
| 59 | MODULE_LICENSE("GPL"); | 59 | MODULE_LICENSE("GPL"); |
| 60 | MODULE_VERSION(SMSC_DRV_VERSION); | 60 | MODULE_VERSION(SMSC_DRV_VERSION); |
| 61 | MODULE_ALIAS("platform:smsc911x"); | ||
| 61 | 62 | ||
| 62 | #if USE_DEBUG > 0 | 63 | #if USE_DEBUG > 0 |
| 63 | static int debug = 16; | 64 | static int debug = 16; |
diff --git a/drivers/net/stmmac/stmmac_main.c b/drivers/net/stmmac/stmmac_main.c index bbb7951b9c4c..ea0461eb2dbe 100644 --- a/drivers/net/stmmac/stmmac_main.c +++ b/drivers/net/stmmac/stmmac_main.c | |||
| @@ -1865,15 +1865,15 @@ static int stmmac_resume(struct platform_device *pdev) | |||
| 1865 | if (!netif_running(dev)) | 1865 | if (!netif_running(dev)) |
| 1866 | return 0; | 1866 | return 0; |
| 1867 | 1867 | ||
| 1868 | spin_lock(&priv->lock); | ||
| 1869 | |||
| 1870 | if (priv->shutdown) { | 1868 | if (priv->shutdown) { |
| 1871 | /* Re-open the interface and re-init the MAC/DMA | 1869 | /* Re-open the interface and re-init the MAC/DMA |
| 1872 | and the rings. */ | 1870 | and the rings (i.e. on hibernation stage) */ |
| 1873 | stmmac_open(dev); | 1871 | stmmac_open(dev); |
| 1874 | goto out_resume; | 1872 | return 0; |
| 1875 | } | 1873 | } |
| 1876 | 1874 | ||
| 1875 | spin_lock(&priv->lock); | ||
| 1876 | |||
| 1877 | /* Power Down bit, into the PM register, is cleared | 1877 | /* Power Down bit, into the PM register, is cleared |
| 1878 | * automatically as soon as a magic packet or a Wake-up frame | 1878 | * automatically as soon as a magic packet or a Wake-up frame |
| 1879 | * is received. Anyway, it's better to manually clear | 1879 | * is received. Anyway, it's better to manually clear |
| @@ -1901,7 +1901,6 @@ static int stmmac_resume(struct platform_device *pdev) | |||
| 1901 | 1901 | ||
| 1902 | netif_start_queue(dev); | 1902 | netif_start_queue(dev); |
| 1903 | 1903 | ||
| 1904 | out_resume: | ||
| 1905 | spin_unlock(&priv->lock); | 1904 | spin_unlock(&priv->lock); |
| 1906 | return 0; | 1905 | return 0; |
| 1907 | } | 1906 | } |
diff --git a/drivers/net/tulip/de2104x.c b/drivers/net/tulip/de2104x.c index 5efa57757a2c..6888e3d41462 100644 --- a/drivers/net/tulip/de2104x.c +++ b/drivers/net/tulip/de2104x.c | |||
| @@ -243,6 +243,7 @@ enum { | |||
| 243 | NWayState = (1 << 14) | (1 << 13) | (1 << 12), | 243 | NWayState = (1 << 14) | (1 << 13) | (1 << 12), |
| 244 | NWayRestart = (1 << 12), | 244 | NWayRestart = (1 << 12), |
| 245 | NonselPortActive = (1 << 9), | 245 | NonselPortActive = (1 << 9), |
| 246 | SelPortActive = (1 << 8), | ||
| 246 | LinkFailStatus = (1 << 2), | 247 | LinkFailStatus = (1 << 2), |
| 247 | NetCxnErr = (1 << 1), | 248 | NetCxnErr = (1 << 1), |
| 248 | }; | 249 | }; |
| @@ -363,7 +364,9 @@ static u16 t21040_csr15[] = { 0, 0, 0x0006, 0x0000, 0x0000, }; | |||
| 363 | 364 | ||
| 364 | /* 21041 transceiver register settings: TP AUTO, BNC, AUI, TP, TP FD*/ | 365 | /* 21041 transceiver register settings: TP AUTO, BNC, AUI, TP, TP FD*/ |
| 365 | static u16 t21041_csr13[] = { 0xEF01, 0xEF09, 0xEF09, 0xEF01, 0xEF09, }; | 366 | static u16 t21041_csr13[] = { 0xEF01, 0xEF09, 0xEF09, 0xEF01, 0xEF09, }; |
| 366 | static u16 t21041_csr14[] = { 0xFFFF, 0xF7FD, 0xF7FD, 0x6F3F, 0x6F3D, }; | 367 | static u16 t21041_csr14[] = { 0xFFFF, 0xF7FD, 0xF7FD, 0x7F3F, 0x7F3D, }; |
| 368 | /* If on-chip autonegotiation is broken, use half-duplex (FF3F) instead */ | ||
| 369 | static u16 t21041_csr14_brk[] = { 0xFF3F, 0xF7FD, 0xF7FD, 0x7F3F, 0x7F3D, }; | ||
| 367 | static u16 t21041_csr15[] = { 0x0008, 0x0006, 0x000E, 0x0008, 0x0008, }; | 370 | static u16 t21041_csr15[] = { 0x0008, 0x0006, 0x000E, 0x0008, 0x0008, }; |
| 368 | 371 | ||
| 369 | 372 | ||
| @@ -1064,6 +1067,9 @@ static void de21041_media_timer (unsigned long data) | |||
| 1064 | unsigned int carrier; | 1067 | unsigned int carrier; |
| 1065 | unsigned long flags; | 1068 | unsigned long flags; |
| 1066 | 1069 | ||
| 1070 | /* clear port active bits */ | ||
| 1071 | dw32(SIAStatus, NonselPortActive | SelPortActive); | ||
| 1072 | |||
| 1067 | carrier = (status & NetCxnErr) ? 0 : 1; | 1073 | carrier = (status & NetCxnErr) ? 0 : 1; |
| 1068 | 1074 | ||
| 1069 | if (carrier) { | 1075 | if (carrier) { |
| @@ -1158,14 +1164,29 @@ no_link_yet: | |||
| 1158 | static void de_media_interrupt (struct de_private *de, u32 status) | 1164 | static void de_media_interrupt (struct de_private *de, u32 status) |
| 1159 | { | 1165 | { |
| 1160 | if (status & LinkPass) { | 1166 | if (status & LinkPass) { |
| 1167 | /* Ignore if current media is AUI or BNC and we can't use TP */ | ||
| 1168 | if ((de->media_type == DE_MEDIA_AUI || | ||
| 1169 | de->media_type == DE_MEDIA_BNC) && | ||
| 1170 | (de->media_lock || | ||
| 1171 | !de_ok_to_advertise(de, DE_MEDIA_TP_AUTO))) | ||
| 1172 | return; | ||
| 1173 | /* If current media is not TP, change it to TP */ | ||
| 1174 | if ((de->media_type == DE_MEDIA_AUI || | ||
| 1175 | de->media_type == DE_MEDIA_BNC)) { | ||
| 1176 | de->media_type = DE_MEDIA_TP_AUTO; | ||
| 1177 | de_stop_rxtx(de); | ||
| 1178 | de_set_media(de); | ||
| 1179 | de_start_rxtx(de); | ||
| 1180 | } | ||
| 1161 | de_link_up(de); | 1181 | de_link_up(de); |
| 1162 | mod_timer(&de->media_timer, jiffies + DE_TIMER_LINK); | 1182 | mod_timer(&de->media_timer, jiffies + DE_TIMER_LINK); |
| 1163 | return; | 1183 | return; |
| 1164 | } | 1184 | } |
| 1165 | 1185 | ||
| 1166 | BUG_ON(!(status & LinkFail)); | 1186 | BUG_ON(!(status & LinkFail)); |
| 1167 | 1187 | /* Mark the link as down only if current media is TP */ | |
| 1168 | if (netif_carrier_ok(de->dev)) { | 1188 | if (netif_carrier_ok(de->dev) && de->media_type != DE_MEDIA_AUI && |
| 1189 | de->media_type != DE_MEDIA_BNC) { | ||
| 1169 | de_link_down(de); | 1190 | de_link_down(de); |
| 1170 | mod_timer(&de->media_timer, jiffies + DE_TIMER_NO_LINK); | 1191 | mod_timer(&de->media_timer, jiffies + DE_TIMER_NO_LINK); |
| 1171 | } | 1192 | } |
| @@ -1229,6 +1250,7 @@ static void de_adapter_sleep (struct de_private *de) | |||
| 1229 | if (de->de21040) | 1250 | if (de->de21040) |
| 1230 | return; | 1251 | return; |
| 1231 | 1252 | ||
| 1253 | dw32(CSR13, 0); /* Reset phy */ | ||
| 1232 | pci_read_config_dword(de->pdev, PCIPM, &pmctl); | 1254 | pci_read_config_dword(de->pdev, PCIPM, &pmctl); |
| 1233 | pmctl |= PM_Sleep; | 1255 | pmctl |= PM_Sleep; |
| 1234 | pci_write_config_dword(de->pdev, PCIPM, pmctl); | 1256 | pci_write_config_dword(de->pdev, PCIPM, pmctl); |
| @@ -1574,12 +1596,15 @@ static int __de_set_settings(struct de_private *de, struct ethtool_cmd *ecmd) | |||
| 1574 | return 0; /* nothing to change */ | 1596 | return 0; /* nothing to change */ |
| 1575 | 1597 | ||
| 1576 | de_link_down(de); | 1598 | de_link_down(de); |
| 1599 | mod_timer(&de->media_timer, jiffies + DE_TIMER_NO_LINK); | ||
| 1577 | de_stop_rxtx(de); | 1600 | de_stop_rxtx(de); |
| 1578 | 1601 | ||
| 1579 | de->media_type = new_media; | 1602 | de->media_type = new_media; |
| 1580 | de->media_lock = media_lock; | 1603 | de->media_lock = media_lock; |
| 1581 | de->media_advertise = ecmd->advertising; | 1604 | de->media_advertise = ecmd->advertising; |
| 1582 | de_set_media(de); | 1605 | de_set_media(de); |
| 1606 | if (netif_running(de->dev)) | ||
| 1607 | de_start_rxtx(de); | ||
| 1583 | 1608 | ||
| 1584 | return 0; | 1609 | return 0; |
| 1585 | } | 1610 | } |
| @@ -1911,8 +1936,14 @@ fill_defaults: | |||
| 1911 | for (i = 0; i < DE_MAX_MEDIA; i++) { | 1936 | for (i = 0; i < DE_MAX_MEDIA; i++) { |
| 1912 | if (de->media[i].csr13 == 0xffff) | 1937 | if (de->media[i].csr13 == 0xffff) |
| 1913 | de->media[i].csr13 = t21041_csr13[i]; | 1938 | de->media[i].csr13 = t21041_csr13[i]; |
| 1914 | if (de->media[i].csr14 == 0xffff) | 1939 | if (de->media[i].csr14 == 0xffff) { |
| 1915 | de->media[i].csr14 = t21041_csr14[i]; | 1940 | /* autonegotiation is broken at least on some chip |
| 1941 | revisions - rev. 0x21 works, 0x11 does not */ | ||
| 1942 | if (de->pdev->revision < 0x20) | ||
| 1943 | de->media[i].csr14 = t21041_csr14_brk[i]; | ||
| 1944 | else | ||
| 1945 | de->media[i].csr14 = t21041_csr14[i]; | ||
| 1946 | } | ||
| 1916 | if (de->media[i].csr15 == 0xffff) | 1947 | if (de->media[i].csr15 == 0xffff) |
| 1917 | de->media[i].csr15 = t21041_csr15[i]; | 1948 | de->media[i].csr15 = t21041_csr15[i]; |
| 1918 | } | 1949 | } |
| @@ -2158,6 +2189,8 @@ static int de_resume (struct pci_dev *pdev) | |||
| 2158 | dev_err(&dev->dev, "pci_enable_device failed in resume\n"); | 2189 | dev_err(&dev->dev, "pci_enable_device failed in resume\n"); |
| 2159 | goto out; | 2190 | goto out; |
| 2160 | } | 2191 | } |
| 2192 | pci_set_master(pdev); | ||
| 2193 | de_init_rings(de); | ||
| 2161 | de_init_hw(de); | 2194 | de_init_hw(de); |
| 2162 | out_attach: | 2195 | out_attach: |
| 2163 | netif_device_attach(dev); | 2196 | netif_device_attach(dev); |
diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c index 6efca66b8766..1cd752f9a6e1 100644 --- a/drivers/net/usb/hso.c +++ b/drivers/net/usb/hso.c | |||
| @@ -1652,6 +1652,8 @@ static int hso_get_count(struct hso_serial *serial, | |||
| 1652 | struct uart_icount cnow; | 1652 | struct uart_icount cnow; |
| 1653 | struct hso_tiocmget *tiocmget = serial->tiocmget; | 1653 | struct hso_tiocmget *tiocmget = serial->tiocmget; |
| 1654 | 1654 | ||
| 1655 | memset(&icount, 0, sizeof(struct serial_icounter_struct)); | ||
| 1656 | |||
| 1655 | if (!tiocmget) | 1657 | if (!tiocmget) |
| 1656 | return -ENOENT; | 1658 | return -ENOENT; |
| 1657 | spin_lock_irq(&serial->serial_lock); | 1659 | spin_lock_irq(&serial->serial_lock); |
diff --git a/drivers/net/usb/ipheth.c b/drivers/net/usb/ipheth.c index 8ed30fa35d0a..b2bcf99e6f08 100644 --- a/drivers/net/usb/ipheth.c +++ b/drivers/net/usb/ipheth.c | |||
| @@ -429,10 +429,6 @@ static const struct net_device_ops ipheth_netdev_ops = { | |||
| 429 | .ndo_get_stats = &ipheth_stats, | 429 | .ndo_get_stats = &ipheth_stats, |
| 430 | }; | 430 | }; |
| 431 | 431 | ||
| 432 | static struct device_type ipheth_type = { | ||
| 433 | .name = "wwan", | ||
| 434 | }; | ||
| 435 | |||
| 436 | static int ipheth_probe(struct usb_interface *intf, | 432 | static int ipheth_probe(struct usb_interface *intf, |
| 437 | const struct usb_device_id *id) | 433 | const struct usb_device_id *id) |
| 438 | { | 434 | { |
| @@ -450,7 +446,7 @@ static int ipheth_probe(struct usb_interface *intf, | |||
| 450 | 446 | ||
| 451 | netdev->netdev_ops = &ipheth_netdev_ops; | 447 | netdev->netdev_ops = &ipheth_netdev_ops; |
| 452 | netdev->watchdog_timeo = IPHETH_TX_TIMEOUT; | 448 | netdev->watchdog_timeo = IPHETH_TX_TIMEOUT; |
| 453 | strcpy(netdev->name, "wwan%d"); | 449 | strcpy(netdev->name, "eth%d"); |
| 454 | 450 | ||
| 455 | dev = netdev_priv(netdev); | 451 | dev = netdev_priv(netdev); |
| 456 | dev->udev = udev; | 452 | dev->udev = udev; |
| @@ -500,7 +496,6 @@ static int ipheth_probe(struct usb_interface *intf, | |||
| 500 | 496 | ||
| 501 | SET_NETDEV_DEV(netdev, &intf->dev); | 497 | SET_NETDEV_DEV(netdev, &intf->dev); |
| 502 | SET_ETHTOOL_OPS(netdev, &ops); | 498 | SET_ETHTOOL_OPS(netdev, &ops); |
| 503 | SET_NETDEV_DEVTYPE(netdev, &ipheth_type); | ||
| 504 | 499 | ||
| 505 | retval = register_netdev(netdev); | 500 | retval = register_netdev(netdev); |
| 506 | if (retval) { | 501 | if (retval) { |
diff --git a/drivers/net/via-velocity.c b/drivers/net/via-velocity.c index fd69095ef6e3..f53412368ce1 100644 --- a/drivers/net/via-velocity.c +++ b/drivers/net/via-velocity.c | |||
| @@ -2824,7 +2824,7 @@ static int __devinit velocity_found1(struct pci_dev *pdev, const struct pci_devi | |||
| 2824 | netif_napi_add(dev, &vptr->napi, velocity_poll, VELOCITY_NAPI_WEIGHT); | 2824 | netif_napi_add(dev, &vptr->napi, velocity_poll, VELOCITY_NAPI_WEIGHT); |
| 2825 | 2825 | ||
| 2826 | dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_FILTER | | 2826 | dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_FILTER | |
| 2827 | NETIF_F_HW_VLAN_RX | NETIF_F_IP_CSUM | NETIF_F_SG; | 2827 | NETIF_F_HW_VLAN_RX | NETIF_F_IP_CSUM; |
| 2828 | 2828 | ||
| 2829 | ret = register_netdev(dev); | 2829 | ret = register_netdev(dev); |
| 2830 | if (ret < 0) | 2830 | if (ret < 0) |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c index 9dd9e64c2b0b..8fd00a6e5120 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c | |||
| @@ -1411,7 +1411,7 @@ void iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif) | |||
| 1411 | clear_bit(STATUS_SCAN_HW, &priv->status); | 1411 | clear_bit(STATUS_SCAN_HW, &priv->status); |
| 1412 | clear_bit(STATUS_SCANNING, &priv->status); | 1412 | clear_bit(STATUS_SCANNING, &priv->status); |
| 1413 | /* inform mac80211 scan aborted */ | 1413 | /* inform mac80211 scan aborted */ |
| 1414 | queue_work(priv->workqueue, &priv->scan_completed); | 1414 | queue_work(priv->workqueue, &priv->abort_scan); |
| 1415 | } | 1415 | } |
| 1416 | 1416 | ||
| 1417 | int iwlagn_manage_ibss_station(struct iwl_priv *priv, | 1417 | int iwlagn_manage_ibss_station(struct iwl_priv *priv, |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c index 07dbc2796448..e23c4060a0f0 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.c +++ b/drivers/net/wireless/iwlwifi/iwl-core.c | |||
| @@ -2613,6 +2613,11 @@ int iwl_force_reset(struct iwl_priv *priv, int mode, bool external) | |||
| 2613 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) | 2613 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) |
| 2614 | return -EINVAL; | 2614 | return -EINVAL; |
| 2615 | 2615 | ||
| 2616 | if (test_bit(STATUS_SCANNING, &priv->status)) { | ||
| 2617 | IWL_DEBUG_INFO(priv, "scan in progress.\n"); | ||
| 2618 | return -EINVAL; | ||
| 2619 | } | ||
| 2620 | |||
| 2616 | if (mode >= IWL_MAX_FORCE_RESET) { | 2621 | if (mode >= IWL_MAX_FORCE_RESET) { |
| 2617 | IWL_DEBUG_INFO(priv, "invalid reset request.\n"); | 2622 | IWL_DEBUG_INFO(priv, "invalid reset request.\n"); |
| 2618 | return -EINVAL; | 2623 | return -EINVAL; |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 59a308b02f95..d31661c1ce77 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
| @@ -3018,7 +3018,7 @@ void iwl3945_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif) | |||
| 3018 | clear_bit(STATUS_SCANNING, &priv->status); | 3018 | clear_bit(STATUS_SCANNING, &priv->status); |
| 3019 | 3019 | ||
| 3020 | /* inform mac80211 scan aborted */ | 3020 | /* inform mac80211 scan aborted */ |
| 3021 | queue_work(priv->workqueue, &priv->scan_completed); | 3021 | queue_work(priv->workqueue, &priv->abort_scan); |
| 3022 | } | 3022 | } |
| 3023 | 3023 | ||
| 3024 | static void iwl3945_bg_restart(struct work_struct *data) | 3024 | static void iwl3945_bg_restart(struct work_struct *data) |
