Commit 230f9bb701d37ae9b48e96456689452978f5c439
Exists in
master
and in
39 other branches
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts: drivers/net/usb/cdc_ether.c All CDC ethernet devices of type USB_CLASS_COMM need to use '&mbm_info'. Signed-off-by: David S. Miller <davem@davemloft.net>
Showing 62 changed files Side-by-side Diff
- MAINTAINERS
- drivers/isdn/hardware/eicon/maintidi.c
- drivers/isdn/hardware/eicon/message.c
- drivers/isdn/hisax/amd7930_fn.c
- drivers/isdn/hisax/diva.c
- drivers/isdn/hisax/hfc_usb.c
- drivers/isdn/hisax/hscx_irq.c
- drivers/isdn/hisax/icc.c
- drivers/isdn/mISDN/stack.c
- drivers/net/benet/be_cmds.h
- drivers/net/davinci_emac.c
- drivers/net/e100.c
- drivers/net/e1000e/defines.h
- drivers/net/e1000e/e1000.h
- drivers/net/e1000e/hw.h
- drivers/net/e1000e/ich8lan.c
- drivers/net/e1000e/phy.c
- drivers/net/pcmcia/pcnet_cs.c
- drivers/net/r8169.c
- drivers/net/sky2.c
- drivers/net/tokenring/ibmtr.c
- drivers/net/usb/Kconfig
- drivers/net/usb/cdc_ether.c
- drivers/net/virtio_net.c
- drivers/net/wireless/ath/ath9k/rc.c
- drivers/net/wireless/b43/dma.c
- drivers/net/wireless/ipw2x00/ipw2100.c
- drivers/net/wireless/ipw2x00/ipw2200.c
- drivers/net/wireless/ipw2x00/libipw.h
- drivers/net/wireless/ipw2x00/libipw_module.c
- drivers/net/wireless/libertas/if_usb.c
- drivers/net/wireless/rt2x00/rt73usb.c
- drivers/serial/serial_cs.c
- firmware/Makefile
- firmware/WHENCE
- firmware/cis/PE-200.cis.ihex
- firmware/cis/SW_555_SER.cis.ihex
- firmware/cis/SW_7xx_SER.cis.ihex
- firmware/cis/SW_8xx_SER.cis.ihex
- include/linux/skbuff.h
- include/net/ip_fib.h
- include/net/netfilter/nf_conntrack.h
- include/net/netfilter/nf_nat_helper.h
- net/bridge/br_if.c
- net/core/datagram.c
- net/decnet/sysctl_net_decnet.c
- net/ipv4/fib_frontend.c
- net/ipv4/ip_gre.c
- net/ipv4/netfilter/nf_nat_core.c
- net/ipv4/netfilter/nf_nat_helper.c
- net/ipv4/route.c
- net/ipv4/udp.c
- net/ipv6/udp.c
- net/mac80211/agg-tx.c
- net/mac80211/cfg.c
- net/mac80211/ht.c
- net/mac80211/ibss.c
- net/netfilter/nf_conntrack_core.c
- net/netfilter/nf_conntrack_proto_tcp.c
- net/rose/rose_route.c
- net/sunrpc/svcsock.c
- net/wireless/sme.c
MAINTAINERS
... | ... | @@ -3655,6 +3655,7 @@ |
3655 | 3655 | W: http://www.linuxfoundation.org/en/Net |
3656 | 3656 | W: http://patchwork.ozlabs.org/project/netdev/list/ |
3657 | 3657 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.git |
3658 | +T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6.git | |
3658 | 3659 | S: Maintained |
3659 | 3660 | F: net/ |
3660 | 3661 | F: include/net/ |
drivers/isdn/hardware/eicon/maintidi.c
... | ... | @@ -959,8 +959,9 @@ |
959 | 959 | } |
960 | 960 | if (!strncmp("State\\Layer2 No1", path, pVar->path_length)) { |
961 | 961 | char* tmp = &pLib->lines[0].pInterface->Layer2[0]; |
962 | - dword l2_state; | |
963 | - diva_strace_read_uint (pVar, &l2_state); | |
962 | + dword l2_state; | |
963 | + if (diva_strace_read_uint(pVar, &l2_state)) | |
964 | + return -1; | |
964 | 965 | |
965 | 966 | switch (l2_state) { |
966 | 967 | case 0: |
drivers/isdn/hardware/eicon/message.c
... | ... | @@ -2692,7 +2692,7 @@ |
2692 | 2692 | if (!(fax_control_bits & T30_CONTROL_BIT_MORE_DOCUMENTS) |
2693 | 2693 | || (fax_feature_bits & T30_FEATURE_BIT_MORE_DOCUMENTS)) |
2694 | 2694 | { |
2695 | - len = (byte)(&(((T30_INFO *) 0)->universal_6)); | |
2695 | + len = offsetof(T30_INFO, universal_6); | |
2696 | 2696 | fax_info_change = false; |
2697 | 2697 | if (ncpi->length >= 4) |
2698 | 2698 | { |
... | ... | @@ -2754,7 +2754,7 @@ |
2754 | 2754 | for (i = 0; i < w; i++) |
2755 | 2755 | ((T30_INFO *)(plci->fax_connect_info_buffer))->station_id[i] = fax_parms[4].info[1+i]; |
2756 | 2756 | ((T30_INFO *)(plci->fax_connect_info_buffer))->head_line_len = 0; |
2757 | - len = (byte)(((T30_INFO *) 0)->station_id + 20); | |
2757 | + len = offsetof(T30_INFO, station_id) + 20; | |
2758 | 2758 | w = fax_parms[5].length; |
2759 | 2759 | if (w > 20) |
2760 | 2760 | w = 20; |
... | ... | @@ -2788,7 +2788,7 @@ |
2788 | 2788 | } |
2789 | 2789 | else |
2790 | 2790 | { |
2791 | - len = (byte)(&(((T30_INFO *) 0)->universal_6)); | |
2791 | + len = offsetof(T30_INFO, universal_6); | |
2792 | 2792 | } |
2793 | 2793 | fax_info_change = true; |
2794 | 2794 | |
... | ... | @@ -2892,7 +2892,7 @@ |
2892 | 2892 | && (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_ENABLE_NSF) |
2893 | 2893 | && (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_NEGOTIATE_RESP)) |
2894 | 2894 | { |
2895 | - len = ((byte)(((T30_INFO *) 0)->station_id + 20)); | |
2895 | + len = offsetof(T30_INFO, station_id) + 20; | |
2896 | 2896 | if (plci->fax_connect_info_length < len) |
2897 | 2897 | { |
2898 | 2898 | ((T30_INFO *)(plci->fax_connect_info_buffer))->station_id_len = 0; |
... | ... | @@ -3802,7 +3802,7 @@ |
3802 | 3802 | break; |
3803 | 3803 | } |
3804 | 3804 | ncpi = &m_parms[1]; |
3805 | - len = ((byte)(((T30_INFO *) 0)->station_id + 20)); | |
3805 | + len = offsetof(T30_INFO, station_id) + 20; | |
3806 | 3806 | if (plci->fax_connect_info_length < len) |
3807 | 3807 | { |
3808 | 3808 | ((T30_INFO *)(plci->fax_connect_info_buffer))->station_id_len = 0; |
... | ... | @@ -6844,7 +6844,7 @@ |
6844 | 6844 | if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[plci->appl->Id-1]) |
6845 | 6845 | & ((1L << PRIVATE_FAX_SUB_SEP_PWD) | (1L << PRIVATE_FAX_NONSTANDARD))) |
6846 | 6846 | { |
6847 | - i = ((word)(((T30_INFO *) 0)->station_id + 20)) + ((T30_INFO *)plci->NL.RBuffer->P)->head_line_len; | |
6847 | + i = offsetof(T30_INFO, station_id) + 20 + ((T30_INFO *)plci->NL.RBuffer->P)->head_line_len; | |
6848 | 6848 | while (i < plci->NL.RBuffer->length) |
6849 | 6849 | plci->ncpi_buffer[++len] = plci->NL.RBuffer->P[i++]; |
6850 | 6850 | } |
... | ... | @@ -7236,7 +7236,7 @@ |
7236 | 7236 | { |
7237 | 7237 | plci->RData[1].P = plci->RData[0].P; |
7238 | 7238 | plci->RData[1].PLength = plci->RData[0].PLength; |
7239 | - plci->RData[0].P = v120_header_buffer + (-((int) v120_header_buffer) & 3); | |
7239 | + plci->RData[0].P = v120_header_buffer + (-((unsigned long)v120_header_buffer) & 3); | |
7240 | 7240 | if ((plci->NL.RBuffer->P[0] & V120_HEADER_EXTEND_BIT) || (plci->NL.RLength == 1)) |
7241 | 7241 | plci->RData[0].PLength = 1; |
7242 | 7242 | else |
... | ... | @@ -8473,7 +8473,7 @@ |
8473 | 8473 | fax_control_bits |= T30_CONTROL_BIT_ACCEPT_SEL_POLLING; |
8474 | 8474 | } |
8475 | 8475 | len = nlc[0]; |
8476 | - pos = ((byte)(((T30_INFO *) 0)->station_id + 20)); | |
8476 | + pos = offsetof(T30_INFO, station_id) + 20; | |
8477 | 8477 | if (pos < plci->fax_connect_info_length) |
8478 | 8478 | { |
8479 | 8479 | for (i = 1 + plci->fax_connect_info_buffer[pos]; i != 0; i--) |
... | ... | @@ -8525,7 +8525,7 @@ |
8525 | 8525 | } |
8526 | 8526 | |
8527 | 8527 | PUT_WORD(&(((T30_INFO *)&nlc[1])->control_bits_low), fax_control_bits); |
8528 | - len = ((byte)(((T30_INFO *) 0)->station_id + 20)); | |
8528 | + len = offsetof(T30_INFO, station_id) + 20; | |
8529 | 8529 | for (i = 0; i < len; i++) |
8530 | 8530 | plci->fax_connect_info_buffer[i] = nlc[1+i]; |
8531 | 8531 | ((T30_INFO *) plci->fax_connect_info_buffer)->head_line_len = 0; |
drivers/isdn/hisax/amd7930_fn.c
drivers/isdn/hisax/diva.c
drivers/isdn/hisax/hfc_usb.c
... | ... | @@ -817,8 +817,8 @@ |
817 | 817 | } |
818 | 818 | /* we have a complete hdlc packet */ |
819 | 819 | if (finish) { |
820 | - if ((!fifo->skbuff->data[fifo->skbuff->len - 1]) | |
821 | - && (fifo->skbuff->len > 3)) { | |
820 | + if (fifo->skbuff->len > 3 && | |
821 | + !fifo->skbuff->data[fifo->skbuff->len - 1]) { | |
822 | 822 | |
823 | 823 | if (fifon == HFCUSB_D_RX) { |
824 | 824 | DBG(HFCUSB_DBG_DCHANNEL, |
drivers/isdn/hisax/hscx_irq.c
drivers/isdn/hisax/icc.c
drivers/isdn/mISDN/stack.c
drivers/net/benet/be_cmds.h
... | ... | @@ -68,7 +68,7 @@ |
68 | 68 | #define CQE_STATUS_COMPL_MASK 0xFFFF |
69 | 69 | #define CQE_STATUS_COMPL_SHIFT 0 /* bits 0 - 15 */ |
70 | 70 | #define CQE_STATUS_EXTD_MASK 0xFFFF |
71 | -#define CQE_STATUS_EXTD_SHIFT 0 /* bits 0 - 15 */ | |
71 | +#define CQE_STATUS_EXTD_SHIFT 16 /* bits 16 - 31 */ | |
72 | 72 | |
73 | 73 | struct be_mcc_compl { |
74 | 74 | u32 status; /* dword 0 */ |
drivers/net/davinci_emac.c
drivers/net/e100.c
... | ... | @@ -1438,18 +1438,30 @@ |
1438 | 1438 | } else |
1439 | 1439 | DPRINTK(HW, DEBUG, "phy_addr = %d\n", nic->mii.phy_id); |
1440 | 1440 | |
1441 | - /* Isolate all the PHY ids */ | |
1442 | - for (addr = 0; addr < 32; addr++) | |
1443 | - mdio_write(netdev, addr, MII_BMCR, BMCR_ISOLATE); | |
1444 | - /* Select the discovered PHY */ | |
1445 | - bmcr &= ~BMCR_ISOLATE; | |
1446 | - mdio_write(netdev, nic->mii.phy_id, MII_BMCR, bmcr); | |
1447 | - | |
1448 | 1441 | /* Get phy ID */ |
1449 | 1442 | id_lo = mdio_read(netdev, nic->mii.phy_id, MII_PHYSID1); |
1450 | 1443 | id_hi = mdio_read(netdev, nic->mii.phy_id, MII_PHYSID2); |
1451 | 1444 | nic->phy = (u32)id_hi << 16 | (u32)id_lo; |
1452 | 1445 | DPRINTK(HW, DEBUG, "phy ID = 0x%08X\n", nic->phy); |
1446 | + | |
1447 | + /* Select the phy and isolate the rest */ | |
1448 | + for (addr = 0; addr < 32; addr++) { | |
1449 | + if (addr != nic->mii.phy_id) { | |
1450 | + mdio_write(netdev, addr, MII_BMCR, BMCR_ISOLATE); | |
1451 | + } else if (nic->phy != phy_82552_v) { | |
1452 | + bmcr = mdio_read(netdev, addr, MII_BMCR); | |
1453 | + mdio_write(netdev, addr, MII_BMCR, | |
1454 | + bmcr & ~BMCR_ISOLATE); | |
1455 | + } | |
1456 | + } | |
1457 | + /* | |
1458 | + * Workaround for 82552: | |
1459 | + * Clear the ISOLATE bit on selected phy_id last (mirrored on all | |
1460 | + * other phy_id's) using bmcr value from addr discovery loop above. | |
1461 | + */ | |
1462 | + if (nic->phy == phy_82552_v) | |
1463 | + mdio_write(netdev, nic->mii.phy_id, MII_BMCR, | |
1464 | + bmcr & ~BMCR_ISOLATE); | |
1453 | 1465 | |
1454 | 1466 | /* Handle National tx phys */ |
1455 | 1467 | #define NCS_PHY_MODEL_MASK 0xFFF0FFFF |
drivers/net/e1000e/defines.h
... | ... | @@ -76,6 +76,7 @@ |
76 | 76 | /* Extended Device Control */ |
77 | 77 | #define E1000_CTRL_EXT_SDP7_DATA 0x00000080 /* Value of SW Definable Pin 7 */ |
78 | 78 | #define E1000_CTRL_EXT_EE_RST 0x00002000 /* Reinitialize from EEPROM */ |
79 | +#define E1000_CTRL_EXT_SPD_BYPS 0x00008000 /* Speed Select Bypass */ | |
79 | 80 | #define E1000_CTRL_EXT_RO_DIS 0x00020000 /* Relaxed Ordering disable */ |
80 | 81 | #define E1000_CTRL_EXT_DMA_DYN_CLK_EN 0x00080000 /* DMA Dynamic Clock Gating */ |
81 | 82 | #define E1000_CTRL_EXT_LINK_MODE_MASK 0x00C00000 |
... | ... | @@ -347,6 +348,7 @@ |
347 | 348 | /* Extended Configuration Control and Size */ |
348 | 349 | #define E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP 0x00000020 |
349 | 350 | #define E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE 0x00000001 |
351 | +#define E1000_EXTCNF_CTRL_OEM_WRITE_ENABLE 0x00000008 | |
350 | 352 | #define E1000_EXTCNF_CTRL_SWFLAG 0x00000020 |
351 | 353 | #define E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_MASK 0x00FF0000 |
352 | 354 | #define E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_SHIFT 16 |
drivers/net/e1000e/e1000.h
... | ... | @@ -141,6 +141,20 @@ |
141 | 141 | #define HV_TNCRS_UPPER PHY_REG(778, 29) /* Transmit with no CRS */ |
142 | 142 | #define HV_TNCRS_LOWER PHY_REG(778, 30) |
143 | 143 | |
144 | +/* BM PHY Copper Specific Status */ | |
145 | +#define BM_CS_STATUS 17 | |
146 | +#define BM_CS_STATUS_LINK_UP 0x0400 | |
147 | +#define BM_CS_STATUS_RESOLVED 0x0800 | |
148 | +#define BM_CS_STATUS_SPEED_MASK 0xC000 | |
149 | +#define BM_CS_STATUS_SPEED_1000 0x8000 | |
150 | + | |
151 | +/* 82577 Mobile Phy Status Register */ | |
152 | +#define HV_M_STATUS 26 | |
153 | +#define HV_M_STATUS_AUTONEG_COMPLETE 0x1000 | |
154 | +#define HV_M_STATUS_SPEED_MASK 0x0300 | |
155 | +#define HV_M_STATUS_SPEED_1000 0x0200 | |
156 | +#define HV_M_STATUS_LINK_UP 0x0040 | |
157 | + | |
144 | 158 | enum e1000_boards { |
145 | 159 | board_82571, |
146 | 160 | board_82572, |
drivers/net/e1000e/hw.h
drivers/net/e1000e/ich8lan.c
... | ... | @@ -124,11 +124,25 @@ |
124 | 124 | |
125 | 125 | #define SW_FLAG_TIMEOUT 1000 /* SW Semaphore flag timeout in milliseconds */ |
126 | 126 | |
127 | +/* SMBus Address Phy Register */ | |
128 | +#define HV_SMB_ADDR PHY_REG(768, 26) | |
129 | +#define HV_SMB_ADDR_PEC_EN 0x0200 | |
130 | +#define HV_SMB_ADDR_VALID 0x0080 | |
131 | + | |
132 | +/* Strapping Option Register - RO */ | |
133 | +#define E1000_STRAP 0x0000C | |
134 | +#define E1000_STRAP_SMBUS_ADDRESS_MASK 0x00FE0000 | |
135 | +#define E1000_STRAP_SMBUS_ADDRESS_SHIFT 17 | |
136 | + | |
127 | 137 | /* OEM Bits Phy Register */ |
128 | 138 | #define HV_OEM_BITS PHY_REG(768, 25) |
129 | 139 | #define HV_OEM_BITS_LPLU 0x0004 /* Low Power Link Up */ |
140 | +#define HV_OEM_BITS_GBE_DIS 0x0040 /* Gigabit Disable */ | |
130 | 141 | #define HV_OEM_BITS_RESTART_AN 0x0400 /* Restart Auto-negotiation */ |
131 | 142 | |
143 | +#define E1000_NVM_K1_CONFIG 0x1B /* NVM K1 Config Word */ | |
144 | +#define E1000_NVM_K1_ENABLE 0x1 /* NVM Enable K1 bit */ | |
145 | + | |
132 | 146 | /* ICH GbE Flash Hardware Sequencing Flash Status Register bit breakdown */ |
133 | 147 | /* Offset 04h HSFSTS */ |
134 | 148 | union ich8_hws_flash_status { |
... | ... | @@ -208,6 +222,9 @@ |
208 | 222 | static s32 e1000_led_on_pchlan(struct e1000_hw *hw); |
209 | 223 | static s32 e1000_led_off_pchlan(struct e1000_hw *hw); |
210 | 224 | static s32 e1000_set_lplu_state_pchlan(struct e1000_hw *hw, bool active); |
225 | +static void e1000_lan_init_done_ich8lan(struct e1000_hw *hw); | |
226 | +static s32 e1000_k1_gig_workaround_hv(struct e1000_hw *hw, bool link); | |
227 | +static s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable); | |
211 | 228 | |
212 | 229 | static inline u16 __er16flash(struct e1000_hw *hw, unsigned long reg) |
213 | 230 | { |
... | ... | @@ -483,14 +500,6 @@ |
483 | 500 | goto out; |
484 | 501 | } |
485 | 502 | |
486 | - if (hw->mac.type == e1000_pchlan) { | |
487 | - ret_val = e1000e_write_kmrn_reg(hw, | |
488 | - E1000_KMRNCTRLSTA_K1_CONFIG, | |
489 | - E1000_KMRNCTRLSTA_K1_ENABLE); | |
490 | - if (ret_val) | |
491 | - goto out; | |
492 | - } | |
493 | - | |
494 | 503 | /* |
495 | 504 | * First we want to see if the MII Status Register reports |
496 | 505 | * link. If so, then we want to get the current speed/duplex |
... | ... | @@ -500,6 +509,12 @@ |
500 | 509 | if (ret_val) |
501 | 510 | goto out; |
502 | 511 | |
512 | + if (hw->mac.type == e1000_pchlan) { | |
513 | + ret_val = e1000_k1_gig_workaround_hv(hw, link); | |
514 | + if (ret_val) | |
515 | + goto out; | |
516 | + } | |
517 | + | |
503 | 518 | if (!link) |
504 | 519 | goto out; /* No link detected */ |
505 | 520 | |
... | ... | @@ -794,6 +809,326 @@ |
794 | 809 | } |
795 | 810 | |
796 | 811 | /** |
812 | + * e1000_sw_lcd_config_ich8lan - SW-based LCD Configuration | |
813 | + * @hw: pointer to the HW structure | |
814 | + * | |
815 | + * SW should configure the LCD from the NVM extended configuration region | |
816 | + * as a workaround for certain parts. | |
817 | + **/ | |
818 | +static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw) | |
819 | +{ | |
820 | + struct e1000_phy_info *phy = &hw->phy; | |
821 | + u32 i, data, cnf_size, cnf_base_addr, sw_cfg_mask; | |
822 | + s32 ret_val; | |
823 | + u16 word_addr, reg_data, reg_addr, phy_page = 0; | |
824 | + | |
825 | + ret_val = hw->phy.ops.acquire_phy(hw); | |
826 | + if (ret_val) | |
827 | + return ret_val; | |
828 | + | |
829 | + /* | |
830 | + * Initialize the PHY from the NVM on ICH platforms. This | |
831 | + * is needed due to an issue where the NVM configuration is | |
832 | + * not properly autoloaded after power transitions. | |
833 | + * Therefore, after each PHY reset, we will load the | |
834 | + * configuration data out of the NVM manually. | |
835 | + */ | |
836 | + if ((hw->mac.type == e1000_ich8lan && phy->type == e1000_phy_igp_3) || | |
837 | + (hw->mac.type == e1000_pchlan)) { | |
838 | + struct e1000_adapter *adapter = hw->adapter; | |
839 | + | |
840 | + /* Check if SW needs to configure the PHY */ | |
841 | + if ((adapter->pdev->device == E1000_DEV_ID_ICH8_IGP_M_AMT) || | |
842 | + (adapter->pdev->device == E1000_DEV_ID_ICH8_IGP_M) || | |
843 | + (hw->mac.type == e1000_pchlan)) | |
844 | + sw_cfg_mask = E1000_FEXTNVM_SW_CONFIG_ICH8M; | |
845 | + else | |
846 | + sw_cfg_mask = E1000_FEXTNVM_SW_CONFIG; | |
847 | + | |
848 | + data = er32(FEXTNVM); | |
849 | + if (!(data & sw_cfg_mask)) | |
850 | + goto out; | |
851 | + | |
852 | + /* Wait for basic configuration completes before proceeding */ | |
853 | + e1000_lan_init_done_ich8lan(hw); | |
854 | + | |
855 | + /* | |
856 | + * Make sure HW does not configure LCD from PHY | |
857 | + * extended configuration before SW configuration | |
858 | + */ | |
859 | + data = er32(EXTCNF_CTRL); | |
860 | + if (data & E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE) | |
861 | + goto out; | |
862 | + | |
863 | + cnf_size = er32(EXTCNF_SIZE); | |
864 | + cnf_size &= E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_MASK; | |
865 | + cnf_size >>= E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_SHIFT; | |
866 | + if (!cnf_size) | |
867 | + goto out; | |
868 | + | |
869 | + cnf_base_addr = data & E1000_EXTCNF_CTRL_EXT_CNF_POINTER_MASK; | |
870 | + cnf_base_addr >>= E1000_EXTCNF_CTRL_EXT_CNF_POINTER_SHIFT; | |
871 | + | |
872 | + if (!(data & E1000_EXTCNF_CTRL_OEM_WRITE_ENABLE) && | |
873 | + (hw->mac.type == e1000_pchlan)) { | |
874 | + /* | |
875 | + * HW configures the SMBus address and LEDs when the | |
876 | + * OEM and LCD Write Enable bits are set in the NVM. | |
877 | + * When both NVM bits are cleared, SW will configure | |
878 | + * them instead. | |
879 | + */ | |
880 | + data = er32(STRAP); | |
881 | + data &= E1000_STRAP_SMBUS_ADDRESS_MASK; | |
882 | + reg_data = data >> E1000_STRAP_SMBUS_ADDRESS_SHIFT; | |
883 | + reg_data |= HV_SMB_ADDR_PEC_EN | HV_SMB_ADDR_VALID; | |
884 | + ret_val = e1000_write_phy_reg_hv_locked(hw, HV_SMB_ADDR, | |
885 | + reg_data); | |
886 | + if (ret_val) | |
887 | + goto out; | |
888 | + | |
889 | + data = er32(LEDCTL); | |
890 | + ret_val = e1000_write_phy_reg_hv_locked(hw, | |
891 | + HV_LED_CONFIG, | |
892 | + (u16)data); | |
893 | + if (ret_val) | |
894 | + goto out; | |
895 | + } | |
896 | + /* Configure LCD from extended configuration region. */ | |
897 | + | |
898 | + /* cnf_base_addr is in DWORD */ | |
899 | + word_addr = (u16)(cnf_base_addr << 1); | |
900 | + | |
901 | + for (i = 0; i < cnf_size; i++) { | |
902 | + ret_val = e1000_read_nvm(hw, (word_addr + i * 2), 1, | |
903 | + ®_data); | |
904 | + if (ret_val) | |
905 | + goto out; | |
906 | + | |
907 | + ret_val = e1000_read_nvm(hw, (word_addr + i * 2 + 1), | |
908 | + 1, ®_addr); | |
909 | + if (ret_val) | |
910 | + goto out; | |
911 | + | |
912 | + /* Save off the PHY page for future writes. */ | |
913 | + if (reg_addr == IGP01E1000_PHY_PAGE_SELECT) { | |
914 | + phy_page = reg_data; | |
915 | + continue; | |
916 | + } | |
917 | + | |
918 | + reg_addr &= PHY_REG_MASK; | |
919 | + reg_addr |= phy_page; | |
920 | + | |
921 | + ret_val = phy->ops.write_phy_reg_locked(hw, | |
922 | + (u32)reg_addr, | |
923 | + reg_data); | |
924 | + if (ret_val) | |
925 | + goto out; | |
926 | + } | |
927 | + } | |
928 | + | |
929 | +out: | |
930 | + hw->phy.ops.release_phy(hw); | |
931 | + return ret_val; | |
932 | +} | |
933 | + | |
934 | +/** | |
935 | + * e1000_k1_gig_workaround_hv - K1 Si workaround | |
936 | + * @hw: pointer to the HW structure | |
937 | + * @link: link up bool flag | |
938 | + * | |
939 | + * If K1 is enabled for 1Gbps, the MAC might stall when transitioning | |
940 | + * from a lower speed. This workaround disables K1 whenever link is at 1Gig | |
941 | + * If link is down, the function will restore the default K1 setting located | |
942 | + * in the NVM. | |
943 | + **/ | |
944 | +static s32 e1000_k1_gig_workaround_hv(struct e1000_hw *hw, bool link) | |
945 | +{ | |
946 | + s32 ret_val = 0; | |
947 | + u16 status_reg = 0; | |
948 | + bool k1_enable = hw->dev_spec.ich8lan.nvm_k1_enabled; | |
949 | + | |
950 | + if (hw->mac.type != e1000_pchlan) | |
951 | + goto out; | |
952 | + | |
953 | + /* Wrap the whole flow with the sw flag */ | |
954 | + ret_val = hw->phy.ops.acquire_phy(hw); | |
955 | + if (ret_val) | |
956 | + goto out; | |
957 | + | |
958 | + /* Disable K1 when link is 1Gbps, otherwise use the NVM setting */ | |
959 | + if (link) { | |
960 | + if (hw->phy.type == e1000_phy_82578) { | |
961 | + ret_val = hw->phy.ops.read_phy_reg_locked(hw, | |
962 | + BM_CS_STATUS, | |
963 | + &status_reg); | |
964 | + if (ret_val) | |
965 | + goto release; | |
966 | + | |
967 | + status_reg &= BM_CS_STATUS_LINK_UP | | |
968 | + BM_CS_STATUS_RESOLVED | | |
969 | + BM_CS_STATUS_SPEED_MASK; | |
970 | + | |
971 | + if (status_reg == (BM_CS_STATUS_LINK_UP | | |
972 | + BM_CS_STATUS_RESOLVED | | |
973 | + BM_CS_STATUS_SPEED_1000)) | |
974 | + k1_enable = false; | |
975 | + } | |
976 | + | |
977 | + if (hw->phy.type == e1000_phy_82577) { | |
978 | + ret_val = hw->phy.ops.read_phy_reg_locked(hw, | |
979 | + HV_M_STATUS, | |
980 | + &status_reg); | |
981 | + if (ret_val) | |
982 | + goto release; | |
983 | + | |
984 | + status_reg &= HV_M_STATUS_LINK_UP | | |
985 | + HV_M_STATUS_AUTONEG_COMPLETE | | |
986 | + HV_M_STATUS_SPEED_MASK; | |
987 | + | |
988 | + if (status_reg == (HV_M_STATUS_LINK_UP | | |
989 | + HV_M_STATUS_AUTONEG_COMPLETE | | |
990 | + HV_M_STATUS_SPEED_1000)) | |
991 | + k1_enable = false; | |
992 | + } | |
993 | + | |
994 | + /* Link stall fix for link up */ | |
995 | + ret_val = hw->phy.ops.write_phy_reg_locked(hw, PHY_REG(770, 19), | |
996 | + 0x0100); | |
997 | + if (ret_val) | |
998 | + goto release; | |
999 | + | |
1000 | + } else { | |
1001 | + /* Link stall fix for link down */ | |
1002 | + ret_val = hw->phy.ops.write_phy_reg_locked(hw, PHY_REG(770, 19), | |
1003 | + 0x4100); | |
1004 | + if (ret_val) | |
1005 | + goto release; | |
1006 | + } | |
1007 | + | |
1008 | + ret_val = e1000_configure_k1_ich8lan(hw, k1_enable); | |
1009 | + | |
1010 | +release: | |
1011 | + hw->phy.ops.release_phy(hw); | |
1012 | +out: | |
1013 | + return ret_val; | |
1014 | +} | |
1015 | + | |
1016 | +/** | |
1017 | + * e1000_configure_k1_ich8lan - Configure K1 power state | |
1018 | + * @hw: pointer to the HW structure | |
1019 | + * @enable: K1 state to configure | |
1020 | + * | |
1021 | + * Configure the K1 power state based on the provided parameter. | |
1022 | + * Assumes semaphore already acquired. | |
1023 | + * | |
1024 | + * Success returns 0, Failure returns -E1000_ERR_PHY (-2) | |
1025 | + **/ | |
1026 | +static s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable) | |
1027 | +{ | |
1028 | + s32 ret_val = 0; | |
1029 | + u32 ctrl_reg = 0; | |
1030 | + u32 ctrl_ext = 0; | |
1031 | + u32 reg = 0; | |
1032 | + u16 kmrn_reg = 0; | |
1033 | + | |
1034 | + ret_val = e1000e_read_kmrn_reg_locked(hw, | |
1035 | + E1000_KMRNCTRLSTA_K1_CONFIG, | |
1036 | + &kmrn_reg); | |
1037 | + if (ret_val) | |
1038 | + goto out; | |
1039 | + | |
1040 | + if (k1_enable) | |
1041 | + kmrn_reg |= E1000_KMRNCTRLSTA_K1_ENABLE; | |
1042 | + else | |
1043 | + kmrn_reg &= ~E1000_KMRNCTRLSTA_K1_ENABLE; | |
1044 | + | |
1045 | + ret_val = e1000e_write_kmrn_reg_locked(hw, | |
1046 | + E1000_KMRNCTRLSTA_K1_CONFIG, | |
1047 | + kmrn_reg); | |
1048 | + if (ret_val) | |
1049 | + goto out; | |
1050 | + | |
1051 | + udelay(20); | |
1052 | + ctrl_ext = er32(CTRL_EXT); | |
1053 | + ctrl_reg = er32(CTRL); | |
1054 | + | |
1055 | + reg = ctrl_reg & ~(E1000_CTRL_SPD_1000 | E1000_CTRL_SPD_100); | |
1056 | + reg |= E1000_CTRL_FRCSPD; | |
1057 | + ew32(CTRL, reg); | |
1058 | + | |
1059 | + ew32(CTRL_EXT, ctrl_ext | E1000_CTRL_EXT_SPD_BYPS); | |
1060 | + udelay(20); | |
1061 | + ew32(CTRL, ctrl_reg); | |
1062 | + ew32(CTRL_EXT, ctrl_ext); | |
1063 | + udelay(20); | |
1064 | + | |
1065 | +out: | |
1066 | + return ret_val; | |
1067 | +} | |
1068 | + | |
1069 | +/** | |
1070 | + * e1000_oem_bits_config_ich8lan - SW-based LCD Configuration | |
1071 | + * @hw: pointer to the HW structure | |
1072 | + * @d0_state: boolean if entering d0 or d3 device state | |
1073 | + * | |
1074 | + * SW will configure Gbe Disable and LPLU based on the NVM. The four bits are | |
1075 | + * collectively called OEM bits. The OEM Write Enable bit and SW Config bit | |
1076 | + * in NVM determines whether HW should configure LPLU and Gbe Disable. | |
1077 | + **/ | |
1078 | +static s32 e1000_oem_bits_config_ich8lan(struct e1000_hw *hw, bool d0_state) | |
1079 | +{ | |
1080 | + s32 ret_val = 0; | |
1081 | + u32 mac_reg; | |
1082 | + u16 oem_reg; | |
1083 | + | |
1084 | + if (hw->mac.type != e1000_pchlan) | |
1085 | + return ret_val; | |
1086 | + | |
1087 | + ret_val = hw->phy.ops.acquire_phy(hw); | |
1088 | + if (ret_val) | |
1089 | + return ret_val; | |
1090 | + | |
1091 | + mac_reg = er32(EXTCNF_CTRL); | |
1092 | + if (mac_reg & E1000_EXTCNF_CTRL_OEM_WRITE_ENABLE) | |
1093 | + goto out; | |
1094 | + | |
1095 | + mac_reg = er32(FEXTNVM); | |
1096 | + if (!(mac_reg & E1000_FEXTNVM_SW_CONFIG_ICH8M)) | |
1097 | + goto out; | |
1098 | + | |
1099 | + mac_reg = er32(PHY_CTRL); | |
1100 | + | |
1101 | + ret_val = hw->phy.ops.read_phy_reg_locked(hw, HV_OEM_BITS, &oem_reg); | |
1102 | + if (ret_val) | |
1103 | + goto out; | |
1104 | + | |
1105 | + oem_reg &= ~(HV_OEM_BITS_GBE_DIS | HV_OEM_BITS_LPLU); | |
1106 | + | |
1107 | + if (d0_state) { | |
1108 | + if (mac_reg & E1000_PHY_CTRL_GBE_DISABLE) | |
1109 | + oem_reg |= HV_OEM_BITS_GBE_DIS; | |
1110 | + | |
1111 | + if (mac_reg & E1000_PHY_CTRL_D0A_LPLU) | |
1112 | + oem_reg |= HV_OEM_BITS_LPLU; | |
1113 | + } else { | |
1114 | + if (mac_reg & E1000_PHY_CTRL_NOND0A_GBE_DISABLE) | |
1115 | + oem_reg |= HV_OEM_BITS_GBE_DIS; | |
1116 | + | |
1117 | + if (mac_reg & E1000_PHY_CTRL_NOND0A_LPLU) | |
1118 | + oem_reg |= HV_OEM_BITS_LPLU; | |
1119 | + } | |
1120 | + /* Restart auto-neg to activate the bits */ | |
1121 | + oem_reg |= HV_OEM_BITS_RESTART_AN; | |
1122 | + ret_val = hw->phy.ops.write_phy_reg_locked(hw, HV_OEM_BITS, oem_reg); | |
1123 | + | |
1124 | +out: | |
1125 | + hw->phy.ops.release_phy(hw); | |
1126 | + | |
1127 | + return ret_val; | |
1128 | +} | |
1129 | + | |
1130 | + | |
1131 | +/** | |
797 | 1132 | * e1000_hv_phy_workarounds_ich8lan - A series of Phy workarounds to be |
798 | 1133 | * done after every PHY reset. |
799 | 1134 | **/ |
800 | 1135 | |
801 | 1136 | |
... | ... | @@ -833,10 +1168,20 @@ |
833 | 1168 | ret_val = hw->phy.ops.acquire_phy(hw); |
834 | 1169 | if (ret_val) |
835 | 1170 | return ret_val; |
1171 | + | |
836 | 1172 | hw->phy.addr = 1; |
837 | - e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, 0); | |
1173 | + ret_val = e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, 0); | |
1174 | + if (ret_val) | |
1175 | + goto out; | |
838 | 1176 | hw->phy.ops.release_phy(hw); |
839 | 1177 | |
1178 | + /* | |
1179 | + * Configure the K1 Si workaround during phy reset assuming there is | |
1180 | + * link so that it disables K1 if link is in 1Gbps. | |
1181 | + */ | |
1182 | + ret_val = e1000_k1_gig_workaround_hv(hw, true); | |
1183 | + | |
1184 | +out: | |
840 | 1185 | return ret_val; |
841 | 1186 | } |
842 | 1187 | |
... | ... | @@ -882,11 +1227,8 @@ |
882 | 1227 | **/ |
883 | 1228 | static s32 e1000_phy_hw_reset_ich8lan(struct e1000_hw *hw) |
884 | 1229 | { |
885 | - struct e1000_phy_info *phy = &hw->phy; | |
886 | - u32 i; | |
887 | - u32 data, cnf_size, cnf_base_addr, sw_cfg_mask; | |
888 | - s32 ret_val; | |
889 | - u16 reg, word_addr, reg_data, reg_addr, phy_page = 0; | |
1230 | + s32 ret_val = 0; | |
1231 | + u16 reg; | |
890 | 1232 | |
891 | 1233 | ret_val = e1000e_phy_hw_reset_generic(hw); |
892 | 1234 | if (ret_val) |
893 | 1235 | |
894 | 1236 | |
... | ... | @@ -905,81 +1247,16 @@ |
905 | 1247 | if (hw->mac.type == e1000_pchlan) |
906 | 1248 | e1e_rphy(hw, BM_WUC, ®); |
907 | 1249 | |
908 | - /* | |
909 | - * Initialize the PHY from the NVM on ICH platforms. This | |
910 | - * is needed due to an issue where the NVM configuration is | |
911 | - * not properly autoloaded after power transitions. | |
912 | - * Therefore, after each PHY reset, we will load the | |
913 | - * configuration data out of the NVM manually. | |
914 | - */ | |
915 | - if (hw->mac.type == e1000_ich8lan && phy->type == e1000_phy_igp_3) { | |
916 | - struct e1000_adapter *adapter = hw->adapter; | |
1250 | + /* Configure the LCD with the extended configuration region in NVM */ | |
1251 | + ret_val = e1000_sw_lcd_config_ich8lan(hw); | |
1252 | + if (ret_val) | |
1253 | + goto out; | |
917 | 1254 | |
918 | - /* Check if SW needs configure the PHY */ | |
919 | - if ((adapter->pdev->device == E1000_DEV_ID_ICH8_IGP_M_AMT) || | |
920 | - (adapter->pdev->device == E1000_DEV_ID_ICH8_IGP_M)) | |
921 | - sw_cfg_mask = E1000_FEXTNVM_SW_CONFIG_ICH8M; | |
922 | - else | |
923 | - sw_cfg_mask = E1000_FEXTNVM_SW_CONFIG; | |
1255 | + /* Configure the LCD with the OEM bits in NVM */ | |
1256 | + if (hw->mac.type == e1000_pchlan) | |
1257 | + ret_val = e1000_oem_bits_config_ich8lan(hw, true); | |
924 | 1258 | |
925 | - data = er32(FEXTNVM); | |
926 | - if (!(data & sw_cfg_mask)) | |
927 | - return 0; | |
928 | - | |
929 | - /* Wait for basic configuration completes before proceeding */ | |
930 | - e1000_lan_init_done_ich8lan(hw); | |
931 | - | |
932 | - /* | |
933 | - * Make sure HW does not configure LCD from PHY | |
934 | - * extended configuration before SW configuration | |
935 | - */ | |
936 | - data = er32(EXTCNF_CTRL); | |
937 | - if (data & E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE) | |
938 | - return 0; | |
939 | - | |
940 | - cnf_size = er32(EXTCNF_SIZE); | |
941 | - cnf_size &= E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_MASK; | |
942 | - cnf_size >>= E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_SHIFT; | |
943 | - if (!cnf_size) | |
944 | - return 0; | |
945 | - | |
946 | - cnf_base_addr = data & E1000_EXTCNF_CTRL_EXT_CNF_POINTER_MASK; | |
947 | - cnf_base_addr >>= E1000_EXTCNF_CTRL_EXT_CNF_POINTER_SHIFT; | |
948 | - | |
949 | - /* Configure LCD from extended configuration region. */ | |
950 | - | |
951 | - /* cnf_base_addr is in DWORD */ | |
952 | - word_addr = (u16)(cnf_base_addr << 1); | |
953 | - | |
954 | - for (i = 0; i < cnf_size; i++) { | |
955 | - ret_val = e1000_read_nvm(hw, | |
956 | - (word_addr + i * 2), | |
957 | - 1, | |
958 | - ®_data); | |
959 | - if (ret_val) | |
960 | - return ret_val; | |
961 | - | |
962 | - ret_val = e1000_read_nvm(hw, | |
963 | - (word_addr + i * 2 + 1), | |
964 | - 1, | |
965 | - ®_addr); | |
966 | - if (ret_val) | |
967 | - return ret_val; | |
968 | - | |
969 | - /* Save off the PHY page for future writes. */ | |
970 | - if (reg_addr == IGP01E1000_PHY_PAGE_SELECT) { | |
971 | - phy_page = reg_data; | |
972 | - continue; | |
973 | - } | |
974 | - | |
975 | - reg_addr |= phy_page; | |
976 | - | |
977 | - ret_val = e1e_wphy(hw, (u32)reg_addr, reg_data); | |
978 | - if (ret_val) | |
979 | - return ret_val; | |
980 | - } | |
981 | - } | |
982 | - | |
1259 | +out: | |
983 | 1260 | return 0; |
984 | 1261 | } |
985 | 1262 | |
... | ... | @@ -2306,6 +2583,7 @@ |
2306 | 2583 | **/ |
2307 | 2584 | static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw) |
2308 | 2585 | { |
2586 | + struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan; | |
2309 | 2587 | u16 reg; |
2310 | 2588 | u32 ctrl, icr, kab; |
2311 | 2589 | s32 ret_val; |
... | ... | @@ -2341,6 +2619,18 @@ |
2341 | 2619 | ew32(PBS, E1000_PBS_16K); |
2342 | 2620 | } |
2343 | 2621 | |
2622 | + if (hw->mac.type == e1000_pchlan) { | |
2623 | + /* Save the NVM K1 bit setting*/ | |
2624 | + ret_val = e1000_read_nvm(hw, E1000_NVM_K1_CONFIG, 1, ®); | |
2625 | + if (ret_val) | |
2626 | + return ret_val; | |
2627 | + | |
2628 | + if (reg & E1000_NVM_K1_ENABLE) | |
2629 | + dev_spec->nvm_k1_enabled = true; | |
2630 | + else | |
2631 | + dev_spec->nvm_k1_enabled = false; | |
2632 | + } | |
2633 | + | |
2344 | 2634 | ctrl = er32(CTRL); |
2345 | 2635 | |
2346 | 2636 | if (!e1000_check_reset_block(hw)) { |
... | ... | @@ -2386,6 +2676,15 @@ |
2386 | 2676 | if (hw->mac.type == e1000_pchlan) |
2387 | 2677 | e1e_rphy(hw, BM_WUC, ®); |
2388 | 2678 | |
2679 | + ret_val = e1000_sw_lcd_config_ich8lan(hw); | |
2680 | + if (ret_val) | |
2681 | + goto out; | |
2682 | + | |
2683 | + if (hw->mac.type == e1000_pchlan) { | |
2684 | + ret_val = e1000_oem_bits_config_ich8lan(hw, true); | |
2685 | + if (ret_val) | |
2686 | + goto out; | |
2687 | + } | |
2389 | 2688 | /* |
2390 | 2689 | * For PCH, this write will make sure that any noise |
2391 | 2690 | * will be detected as a CRC error and be dropped rather than show up |
... | ... | @@ -2404,6 +2703,7 @@ |
2404 | 2703 | if (hw->mac.type == e1000_pchlan) |
2405 | 2704 | ret_val = e1000_hv_phy_workarounds_ich8lan(hw); |
2406 | 2705 | |
2706 | +out: | |
2407 | 2707 | return ret_val; |
2408 | 2708 | } |
2409 | 2709 | |
... | ... | @@ -2707,14 +3007,6 @@ |
2707 | 3007 | ret_val = e1000e_get_speed_and_duplex_copper(hw, speed, duplex); |
2708 | 3008 | if (ret_val) |
2709 | 3009 | return ret_val; |
2710 | - | |
2711 | - if ((hw->mac.type == e1000_pchlan) && (*speed == SPEED_1000)) { | |
2712 | - ret_val = e1000e_write_kmrn_reg(hw, | |
2713 | - E1000_KMRNCTRLSTA_K1_CONFIG, | |
2714 | - E1000_KMRNCTRLSTA_K1_DISABLE); | |
2715 | - if (ret_val) | |
2716 | - return ret_val; | |
2717 | - } | |
2718 | 3010 | |
2719 | 3011 | if ((hw->mac.type == e1000_ich8lan) && |
2720 | 3012 | (hw->phy.type == e1000_phy_igp_3) && |
drivers/net/e1000e/phy.c
... | ... | @@ -95,13 +95,6 @@ |
95 | 95 | /* BM PHY Copper Specific Control 1 */ |
96 | 96 | #define BM_CS_CTRL1 16 |
97 | 97 | |
98 | -/* BM PHY Copper Specific Status */ | |
99 | -#define BM_CS_STATUS 17 | |
100 | -#define BM_CS_STATUS_LINK_UP 0x0400 | |
101 | -#define BM_CS_STATUS_RESOLVED 0x0800 | |
102 | -#define BM_CS_STATUS_SPEED_MASK 0xC000 | |
103 | -#define BM_CS_STATUS_SPEED_1000 0x8000 | |
104 | - | |
105 | 98 | #define HV_MUX_DATA_CTRL PHY_REG(776, 16) |
106 | 99 | #define HV_MUX_DATA_CTRL_GEN_TO_MAC 0x0400 |
107 | 100 | #define HV_MUX_DATA_CTRL_FORCE_SPEED 0x0004 |
... | ... | @@ -563,7 +556,7 @@ |
563 | 556 | } |
564 | 557 | |
565 | 558 | /** |
566 | - * e1000_read_kmrn_reg_locked - Read kumeran register | |
559 | + * e1000e_read_kmrn_reg_locked - Read kumeran register | |
567 | 560 | * @hw: pointer to the HW structure |
568 | 561 | * @offset: register offset to be read |
569 | 562 | * @data: pointer to the read data |
... | ... | @@ -572,7 +565,7 @@ |
572 | 565 | * information retrieved is stored in data. |
573 | 566 | * Assumes semaphore already acquired. |
574 | 567 | **/ |
575 | -s32 e1000_read_kmrn_reg_locked(struct e1000_hw *hw, u32 offset, u16 *data) | |
568 | +s32 e1000e_read_kmrn_reg_locked(struct e1000_hw *hw, u32 offset, u16 *data) | |
576 | 569 | { |
577 | 570 | return __e1000_read_kmrn_reg(hw, offset, data, true); |
578 | 571 | } |
... | ... | @@ -631,7 +624,7 @@ |
631 | 624 | } |
632 | 625 | |
633 | 626 | /** |
634 | - * e1000_write_kmrn_reg_locked - Write kumeran register | |
627 | + * e1000e_write_kmrn_reg_locked - Write kumeran register | |
635 | 628 | * @hw: pointer to the HW structure |
636 | 629 | * @offset: register offset to write to |
637 | 630 | * @data: data to write at register offset |
... | ... | @@ -639,7 +632,7 @@ |
639 | 632 | * Write the data to PHY register at the offset using the kumeran interface. |
640 | 633 | * Assumes semaphore already acquired. |
641 | 634 | **/ |
642 | -s32 e1000_write_kmrn_reg_locked(struct e1000_hw *hw, u32 offset, u16 data) | |
635 | +s32 e1000e_write_kmrn_reg_locked(struct e1000_hw *hw, u32 offset, u16 data) | |
643 | 636 | { |
644 | 637 | return __e1000_write_kmrn_reg(hw, offset, data, true); |
645 | 638 | } |
drivers/net/pcmcia/pcnet_cs.c
... | ... | @@ -1760,7 +1760,7 @@ |
1760 | 1760 | PCMCIA_DEVICE_CIS_MANF_CARD(0xc00f, 0x0002, "cis/LA-PCM.cis"), |
1761 | 1761 | PCMCIA_DEVICE_CIS_PROD_ID12("KTI", "PE520 PLUS", 0xad180345, 0x9d58d392, "PE520.cis"), |
1762 | 1762 | PCMCIA_DEVICE_CIS_PROD_ID12("NDC", "Ethernet", 0x01c43ae1, 0x00b2e941, "cis/NE2K.cis"), |
1763 | - PCMCIA_DEVICE_CIS_PROD_ID12("PMX ", "PE-200", 0x34f3f1c8, 0x10b59f8c, "PE-200.cis"), | |
1763 | + PCMCIA_DEVICE_CIS_PROD_ID12("PMX ", "PE-200", 0x34f3f1c8, 0x10b59f8c, "cis/PE-200.cis"), | |
1764 | 1764 | PCMCIA_DEVICE_CIS_PROD_ID12("TAMARACK", "Ethernet", 0xcf434fba, 0x00b2e941, "cis/tamarack.cis"), |
1765 | 1765 | PCMCIA_DEVICE_PROD_ID12("Ethernet", "CF Size PC Card", 0x00b2e941, 0x43ac239b), |
1766 | 1766 | PCMCIA_DEVICE_PROD_ID123("Fast Ethernet", "CF Size PC Card", "1.0", |
drivers/net/r8169.c
... | ... | @@ -3379,7 +3379,7 @@ |
3379 | 3379 | static void rtl_set_rx_max_size(void __iomem *ioaddr, unsigned int rx_buf_sz) |
3380 | 3380 | { |
3381 | 3381 | /* Low hurts. Let's disable the filtering. */ |
3382 | - RTL_W16(RxMaxSize, rx_buf_sz); | |
3382 | + RTL_W16(RxMaxSize, rx_buf_sz + 1); | |
3383 | 3383 | } |
3384 | 3384 | |
3385 | 3385 | static void rtl8169_set_magic_reg(void __iomem *ioaddr, unsigned mac_version) |
drivers/net/sky2.c
drivers/net/tokenring/ibmtr.c
... | ... | @@ -1143,9 +1143,16 @@ |
1143 | 1143 | } else { |
1144 | 1144 | char **prphase = printphase; |
1145 | 1145 | char **prerror = printerror; |
1146 | + int pnr = err / 16 - 1; | |
1147 | + int enr = err % 16 - 1; | |
1146 | 1148 | DPRINTK("TR Adapter misc open failure, error code = "); |
1147 | - printk("0x%x, Phase: %s, Error: %s\n", | |
1148 | - err, prphase[err/16 -1], prerror[err%16 -1]); | |
1149 | + if (pnr < 0 || pnr >= ARRAY_SIZE(printphase) || | |
1150 | + enr < 0 || | |
1151 | + enr >= ARRAY_SIZE(printerror)) | |
1152 | + printk("0x%x, invalid Phase/Error.", err); | |
1153 | + else | |
1154 | + printk("0x%x, Phase: %s, Error: %s\n", err, | |
1155 | + prphase[pnr], prerror[enr]); | |
1149 | 1156 | printk(" retrying after %ds delay...\n", |
1150 | 1157 | TR_RETRY_INTERVAL/HZ); |
1151 | 1158 | } |
drivers/net/usb/Kconfig
... | ... | @@ -174,7 +174,7 @@ |
174 | 174 | * Ericsson Mobile Broadband Module (all variants) |
175 | 175 | * Motorola (DM100 and SB4100) |
176 | 176 | * Broadcom Cable Modem (reference design) |
177 | - * Toshiba (PCX1100U and F3507g) | |
177 | + * Toshiba (PCX1100U and F3507g/F3607gw) | |
178 | 178 | * ... |
179 | 179 | |
180 | 180 | This driver creates an interface named "ethX", where X depends on |
drivers/net/usb/cdc_ether.c
... | ... | @@ -552,18 +552,58 @@ |
552 | 552 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), |
553 | 553 | .driver_info = (unsigned long) &mbm_info, |
554 | 554 | }, { |
555 | - /* Ericsson F3307 */ | |
555 | + /* Ericsson F3607gw ver 2 */ | |
556 | + USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1905, USB_CLASS_COMM, | |
557 | + USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | |
558 | + .driver_info = (unsigned long) &mbm_info, | |
559 | +}, { | |
560 | + /* Ericsson F3607gw ver 3 */ | |
556 | 561 | USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1906, USB_CLASS_COMM, |
557 | 562 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), |
558 | 563 | .driver_info = (unsigned long) &mbm_info, |
559 | 564 | }, { |
565 | + /* Ericsson F3307 */ | |
566 | + USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x190a, USB_CLASS_COMM, | |
567 | + USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | |
568 | + .driver_info = (unsigned long) &mbm_info, | |
569 | +}, { | |
570 | + /* Ericsson F3307 ver 2 */ | |
571 | + USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1909, USB_CLASS_COMM, | |
572 | + USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | |
573 | + .driver_info = (unsigned long) &mbm_info, | |
574 | +}, { | |
575 | + /* Ericsson C3607w */ | |
576 | + USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1049, USB_CLASS_COMM, | |
577 | + USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | |
578 | + .driver_info = (unsigned long) &mbm_info, | |
579 | +}, { | |
560 | 580 | /* Toshiba F3507g */ |
561 | 581 | USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x130b, USB_CLASS_COMM, |
562 | 582 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), |
563 | 583 | .driver_info = (unsigned long) &mbm_info, |
564 | 584 | }, { |
585 | + /* Toshiba F3607gw */ | |
586 | + USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x130c, USB_CLASS_COMM, | |
587 | + USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | |
588 | + .driver_info = (unsigned long) &mbm_info, | |
589 | +}, { | |
590 | + /* Toshiba F3607gw ver 2 */ | |
591 | + USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x1311, USB_CLASS_COMM, | |
592 | + USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | |
593 | + .driver_info = (unsigned long) &mbm_info, | |
594 | +}, { | |
565 | 595 | /* Dell F3507g */ |
566 | 596 | USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x8147, USB_CLASS_COMM, |
597 | + USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | |
598 | + .driver_info = (unsigned long) &mbm_info, | |
599 | +}, { | |
600 | + /* Dell F3607gw */ | |
601 | + USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x8183, USB_CLASS_COMM, | |
602 | + USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | |
603 | + .driver_info = (unsigned long) &mbm_info, | |
604 | +}, { | |
605 | + /* Dell F3607gw ver 2 */ | |
606 | + USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x8184, USB_CLASS_COMM, | |
567 | 607 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), |
568 | 608 | .driver_info = (unsigned long) &mbm_info, |
569 | 609 | }, |
drivers/net/virtio_net.c
... | ... | @@ -996,7 +996,7 @@ |
996 | 996 | VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN, |
997 | 997 | }; |
998 | 998 | |
999 | -static struct virtio_driver virtio_net = { | |
999 | +static struct virtio_driver virtio_net_driver = { | |
1000 | 1000 | .feature_table = features, |
1001 | 1001 | .feature_table_size = ARRAY_SIZE(features), |
1002 | 1002 | .driver.name = KBUILD_MODNAME, |
1003 | 1003 | |
... | ... | @@ -1009,12 +1009,12 @@ |
1009 | 1009 | |
1010 | 1010 | static int __init init(void) |
1011 | 1011 | { |
1012 | - return register_virtio_driver(&virtio_net); | |
1012 | + return register_virtio_driver(&virtio_net_driver); | |
1013 | 1013 | } |
1014 | 1014 | |
1015 | 1015 | static void __exit fini(void) |
1016 | 1016 | { |
1017 | - unregister_virtio_driver(&virtio_net); | |
1017 | + unregister_virtio_driver(&virtio_net_driver); | |
1018 | 1018 | } |
1019 | 1019 | module_init(init); |
1020 | 1020 | module_exit(fini); |
drivers/net/wireless/ath/ath9k/rc.c
drivers/net/wireless/b43/dma.c
... | ... | @@ -1157,8 +1157,9 @@ |
1157 | 1157 | } |
1158 | 1158 | |
1159 | 1159 | static int dma_tx_fragment(struct b43_dmaring *ring, |
1160 | - struct sk_buff *skb) | |
1160 | + struct sk_buff **in_skb) | |
1161 | 1161 | { |
1162 | + struct sk_buff *skb = *in_skb; | |
1162 | 1163 | const struct b43_dma_ops *ops = ring->ops; |
1163 | 1164 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
1164 | 1165 | u8 *header; |
1165 | 1166 | |
... | ... | @@ -1224,8 +1225,14 @@ |
1224 | 1225 | } |
1225 | 1226 | |
1226 | 1227 | memcpy(skb_put(bounce_skb, skb->len), skb->data, skb->len); |
1228 | + memcpy(bounce_skb->cb, skb->cb, sizeof(skb->cb)); | |
1229 | + bounce_skb->dev = skb->dev; | |
1230 | + skb_set_queue_mapping(bounce_skb, skb_get_queue_mapping(skb)); | |
1231 | + info = IEEE80211_SKB_CB(bounce_skb); | |
1232 | + | |
1227 | 1233 | dev_kfree_skb_any(skb); |
1228 | 1234 | skb = bounce_skb; |
1235 | + *in_skb = bounce_skb; | |
1229 | 1236 | meta->skb = skb; |
1230 | 1237 | meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1); |
1231 | 1238 | if (b43_dma_mapping_error(ring, meta->dmaaddr, skb->len, 1)) { |
... | ... | @@ -1355,7 +1362,11 @@ |
1355 | 1362 | * static, so we don't need to store it per frame. */ |
1356 | 1363 | ring->queue_prio = skb_get_queue_mapping(skb); |
1357 | 1364 | |
1358 | - err = dma_tx_fragment(ring, skb); | |
1365 | + /* dma_tx_fragment might reallocate the skb, so invalidate pointers pointing | |
1366 | + * into the skb data or cb now. */ | |
1367 | + hdr = NULL; | |
1368 | + info = NULL; | |
1369 | + err = dma_tx_fragment(ring, &skb); | |
1359 | 1370 | if (unlikely(err == -ENOKEY)) { |
1360 | 1371 | /* Drop this packet, as we don't have the encryption key |
1361 | 1372 | * anymore and must not transmit it unencrypted. */ |
drivers/net/wireless/ipw2x00/ipw2100.c
... | ... | @@ -6325,8 +6325,10 @@ |
6325 | 6325 | |
6326 | 6326 | fail: |
6327 | 6327 | if (dev) { |
6328 | - if (registered) | |
6328 | + if (registered) { | |
6329 | + unregister_ieee80211(priv->ieee); | |
6329 | 6330 | unregister_netdev(dev); |
6331 | + } | |
6330 | 6332 | |
6331 | 6333 | ipw2100_hw_stop_adapter(priv); |
6332 | 6334 | |
... | ... | @@ -6383,6 +6385,7 @@ |
6383 | 6385 | /* Unregister the device first - this results in close() |
6384 | 6386 | * being called if the device is open. If we free storage |
6385 | 6387 | * first, then close() will crash. */ |
6388 | + unregister_ieee80211(priv->ieee); | |
6386 | 6389 | unregister_netdev(dev); |
6387 | 6390 | |
6388 | 6391 | /* ipw2100_down will ensure that there is no more pending work |
drivers/net/wireless/ipw2x00/ipw2200.c
... | ... | @@ -11822,6 +11822,7 @@ |
11822 | 11822 | if (err) { |
11823 | 11823 | IPW_ERROR("Failed to register promiscuous network " |
11824 | 11824 | "device (error %d).\n", err); |
11825 | + unregister_ieee80211(priv->ieee); | |
11825 | 11826 | unregister_netdev(priv->net_dev); |
11826 | 11827 | goto out_remove_sysfs; |
11827 | 11828 | } |
... | ... | @@ -11872,6 +11873,7 @@ |
11872 | 11873 | |
11873 | 11874 | mutex_unlock(&priv->mutex); |
11874 | 11875 | |
11876 | + unregister_ieee80211(priv->ieee); | |
11875 | 11877 | unregister_netdev(priv->net_dev); |
11876 | 11878 | |
11877 | 11879 | if (priv->rxq) { |
drivers/net/wireless/ipw2x00/libipw.h
... | ... | @@ -1020,6 +1020,7 @@ |
1020 | 1020 | /* ieee80211.c */ |
1021 | 1021 | extern void free_ieee80211(struct net_device *dev, int monitor); |
1022 | 1022 | extern struct net_device *alloc_ieee80211(int sizeof_priv, int monitor); |
1023 | +extern void unregister_ieee80211(struct libipw_device *ieee); | |
1023 | 1024 | extern int libipw_change_mtu(struct net_device *dev, int new_mtu); |
1024 | 1025 | |
1025 | 1026 | extern void libipw_networks_age(struct libipw_device *ieee, |
drivers/net/wireless/ipw2x00/libipw_module.c
... | ... | @@ -235,16 +235,19 @@ |
235 | 235 | libipw_networks_free(ieee); |
236 | 236 | |
237 | 237 | /* free cfg80211 resources */ |
238 | - if (!monitor) { | |
239 | - wiphy_unregister(ieee->wdev.wiphy); | |
240 | - kfree(ieee->a_band.channels); | |
241 | - kfree(ieee->bg_band.channels); | |
238 | + if (!monitor) | |
242 | 239 | wiphy_free(ieee->wdev.wiphy); |
243 | - } | |
244 | 240 | |
245 | 241 | free_netdev(dev); |
246 | 242 | } |
247 | 243 | |
244 | +void unregister_ieee80211(struct libipw_device *ieee) | |
245 | +{ | |
246 | + wiphy_unregister(ieee->wdev.wiphy); | |
247 | + kfree(ieee->a_band.channels); | |
248 | + kfree(ieee->bg_band.channels); | |
249 | +} | |
250 | + | |
248 | 251 | #ifdef CONFIG_LIBIPW_DEBUG |
249 | 252 | |
250 | 253 | static int debug = 0; |
... | ... | @@ -330,4 +333,5 @@ |
330 | 333 | |
331 | 334 | EXPORT_SYMBOL(alloc_ieee80211); |
332 | 335 | EXPORT_SYMBOL(free_ieee80211); |
336 | +EXPORT_SYMBOL(unregister_ieee80211); |
drivers/net/wireless/libertas/if_usb.c
... | ... | @@ -511,7 +511,7 @@ |
511 | 511 | /* Fill the receive configuration URB and initialise the Rx call back */ |
512 | 512 | usb_fill_bulk_urb(cardp->rx_urb, cardp->udev, |
513 | 513 | usb_rcvbulkpipe(cardp->udev, cardp->ep_in), |
514 | - (void *) (skb->tail + (size_t) IPFIELD_ALIGN_OFFSET), | |
514 | + skb->data + IPFIELD_ALIGN_OFFSET, | |
515 | 515 | MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn, |
516 | 516 | cardp); |
517 | 517 |
drivers/net/wireless/rt2x00/rt73usb.c
... | ... | @@ -2389,10 +2389,13 @@ |
2389 | 2389 | { USB_DEVICE(0x13b1, 0x0023), USB_DEVICE_DATA(&rt73usb_ops) }, |
2390 | 2390 | { USB_DEVICE(0x13b1, 0x0028), USB_DEVICE_DATA(&rt73usb_ops) }, |
2391 | 2391 | /* MSI */ |
2392 | + { USB_DEVICE(0x0db0, 0x4600), USB_DEVICE_DATA(&rt73usb_ops) }, | |
2392 | 2393 | { USB_DEVICE(0x0db0, 0x6877), USB_DEVICE_DATA(&rt73usb_ops) }, |
2393 | 2394 | { USB_DEVICE(0x0db0, 0x6874), USB_DEVICE_DATA(&rt73usb_ops) }, |
2394 | 2395 | { USB_DEVICE(0x0db0, 0xa861), USB_DEVICE_DATA(&rt73usb_ops) }, |
2395 | 2396 | { USB_DEVICE(0x0db0, 0xa874), USB_DEVICE_DATA(&rt73usb_ops) }, |
2397 | + /* Ovislink */ | |
2398 | + { USB_DEVICE(0x1b75, 0x7318), USB_DEVICE_DATA(&rt73usb_ops) }, | |
2396 | 2399 | /* Ralink */ |
2397 | 2400 | { USB_DEVICE(0x04bb, 0x093d), USB_DEVICE_DATA(&rt73usb_ops) }, |
2398 | 2401 | { USB_DEVICE(0x148f, 0x2573), USB_DEVICE_DATA(&rt73usb_ops) }, |
... | ... | @@ -2420,6 +2423,8 @@ |
2420 | 2423 | /* Planex */ |
2421 | 2424 | { USB_DEVICE(0x2019, 0xab01), USB_DEVICE_DATA(&rt73usb_ops) }, |
2422 | 2425 | { USB_DEVICE(0x2019, 0xab50), USB_DEVICE_DATA(&rt73usb_ops) }, |
2426 | + /* WideTell */ | |
2427 | + { USB_DEVICE(0x7167, 0x3840), USB_DEVICE_DATA(&rt73usb_ops) }, | |
2423 | 2428 | /* Zcom */ |
2424 | 2429 | { USB_DEVICE(0x0cde, 0x001c), USB_DEVICE_DATA(&rt73usb_ops) }, |
2425 | 2430 | /* ZyXEL */ |
drivers/serial/serial_cs.c
... | ... | @@ -879,10 +879,10 @@ |
879 | 879 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0175, 0x0000, "cis/DP83903.cis"), |
880 | 880 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0035, "cis/3CXEM556.cis"), |
881 | 881 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x003d, "cis/3CXEM556.cis"), |
882 | - PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC850", 0xd85f6206, 0x42a2c018, "SW_8xx_SER.cis"), /* Sierra Wireless AC850 3G Network Adapter R1 */ | |
883 | - PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0x0710, "SW_7xx_SER.cis"), /* Sierra Wireless AC710/AC750 GPRS Network Adapter R1 */ | |
884 | - PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- pre update */ | |
885 | - PCMCIA_DEVICE_CIS_MANF_CARD(0x013f, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- post update */ | |
882 | + PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC850", 0xd85f6206, 0x42a2c018, "cis/SW_8xx_SER.cis"), /* Sierra Wireless AC850 3G Network Adapter R1 */ | |
883 | + PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC710/AC750", 0xd85f6206, 0x761b11e0, "cis/SW_7xx_SER.cis"), /* Sierra Wireless AC710/AC750 GPRS Network Adapter R1 */ | |
884 | + PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0xa555, "cis/SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- pre update */ | |
885 | + PCMCIA_DEVICE_CIS_MANF_CARD(0x013f, 0xa555, "cis/SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- post update */ | |
886 | 886 | PCMCIA_DEVICE_CIS_PROD_ID12("MultiTech", "PCMCIA 56K DataFax", 0x842047ee, 0xc2efcf03, "cis/MT5634ZLX.cis"), |
887 | 887 | PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-2", 0x96913a85, 0x27ab5437, "cis/COMpad2.cis"), |
888 | 888 | PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "cis/COMpad4.cis"), |
firmware/Makefile
... | ... | @@ -69,11 +69,13 @@ |
69 | 69 | fw-shipped-$(CONFIG_MYRI_SBUS) += myricom/lanai.bin |
70 | 70 | fw-shipped-$(CONFIG_PCMCIA_PCNET) += cis/LA-PCM.cis cis/PCMLM28.cis \ |
71 | 71 | cis/DP83903.cis cis/NE2K.cis \ |
72 | - cis/tamarack.cis | |
72 | + cis/tamarack.cis cis/PE-200.cis | |
73 | 73 | fw-shipped-$(CONFIG_PCMCIA_3C589) += cis/3CXEM556.cis |
74 | 74 | fw-shipped-$(CONFIG_PCMCIA_3C574) += cis/3CCFEM556.cis |
75 | 75 | fw-shipped-$(CONFIG_SERIAL_8250_CS) += cis/MT5634ZLX.cis cis/RS-COM-2P.cis \ |
76 | - cis/COMpad2.cis cis/COMpad4.cis | |
76 | + cis/COMpad2.cis cis/COMpad4.cis \ | |
77 | + cis/SW_555_SER.cis cis/SW_7xx_SER.cis \ | |
78 | + cis/SW_8xx_SER.cis | |
77 | 79 | fw-shipped-$(CONFIG_PCMCIA_SMC91C92) += ositech/Xilinx7OD.bin |
78 | 80 | fw-shipped-$(CONFIG_SCSI_ADVANSYS) += advansys/mcode.bin advansys/38C1600.bin \ |
79 | 81 | advansys/3550.bin advansys/38C0800.bin |
firmware/WHENCE
... | ... | @@ -600,6 +600,7 @@ |
600 | 600 | cis/DP83903.cis |
601 | 601 | cis/NE2K.cis |
602 | 602 | cis/tamarack.cis |
603 | + cis/PE-200.cis | |
603 | 604 | |
604 | 605 | Licence: GPL |
605 | 606 | |
... | ... | @@ -633,6 +634,9 @@ |
633 | 634 | cis/RS-COM-2P.cis |
634 | 635 | cis/COMpad2.cis |
635 | 636 | cis/COMpad4.cis |
637 | + cis/SW_555_SER.cis | |
638 | + cis/SW_7xx_SER.cis | |
639 | + cis/SW_8xx_SER.cis | |
636 | 640 | |
637 | 641 | Licence: GPL |
638 | 642 |
firmware/cis/PE-200.cis.ihex
firmware/cis/SW_555_SER.cis.ihex
1 | +:100000000101FF17034100FF20043F0110072102F7 | |
2 | +:100010000200152A070053696572726120576972E0 | |
3 | +:10002000656C657373004169724361726420353594 | |
4 | +:1000300035004135353500526576203100FF1A050F | |
5 | +:1000400001030007731B0BE00118A360F8030730DE | |
6 | +:10005000BC3F1B08A10108A360F802071B08A2010E | |
7 | +:1000600008A360E803071B08A30108A360E80207D0 | |
8 | +:0A0070001B04A40108231400FF0084 | |
9 | +:00000001FF | |
10 | +# | |
11 | +# Replacement CIS for AC555 provided by Sierra Wireless | |
12 | +# |
firmware/cis/SW_7xx_SER.cis.ihex
1 | +:100000000101FF17034100FF2004920110072102A4 | |
2 | +:1000100002001537070053696572726120576972D3 | |
3 | +:10002000656C6573730041433731302F4143373579 | |
4 | +:10003000300047505253204E6574776F726B2041E9 | |
5 | +:1000400064617074657200523100FF1A050103008B | |
6 | +:1000500007731B10E00119784D555D25A360F80367 | |
7 | +:100060000730BC861B08A10108A360F802071B0823 | |
8 | +:10007000A20108A360E803071B08A30108A360E826 | |
9 | +:0C00800002071B04A40108231400FF0069 | |
10 | +:00000001FF | |
11 | +# | |
12 | +# Replacement CIS for AC7xx provided by Sierra Wireless | |
13 | +# |
firmware/cis/SW_8xx_SER.cis.ihex
1 | +:100000000101FF17034100FF2004920110072102A4 | |
2 | +:100010000200152F070053696572726120576972DB | |
3 | +:10002000656C657373004143383530003347204EAB | |
4 | +:100030006574776F726B20416461707465720052F1 | |
5 | +:100040003100FF1A0501030007731B10E001197846 | |
6 | +:100050004D555D25A360F8480730BC861B08A101FB | |
7 | +:1000600008A360F847071B08A20108A360E8480737 | |
8 | +:100070001B08A30108A360E847071B04A401082389 | |
9 | +:040080001400FF0069 | |
10 | +:00000001FF | |
11 | +# | |
12 | +# Replacement CIS for AC8xx provided by Sierra Wireless | |
13 | +# |
include/linux/skbuff.h
... | ... | @@ -354,8 +354,8 @@ |
354 | 354 | ipvs_property:1, |
355 | 355 | peeked:1, |
356 | 356 | nf_trace:1; |
357 | + __be16 protocol:16; | |
357 | 358 | kmemcheck_bitfield_end(flags1); |
358 | - __be16 protocol; | |
359 | 359 | |
360 | 360 | void (*destructor)(struct sk_buff *skb); |
361 | 361 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) |
... | ... | @@ -367,7 +367,6 @@ |
367 | 367 | #endif |
368 | 368 | |
369 | 369 | int iif; |
370 | - __u16 queue_mapping; | |
371 | 370 | #ifdef CONFIG_NET_SCHED |
372 | 371 | __u16 tc_index; /* traffic control index */ |
373 | 372 | #ifdef CONFIG_NET_CLS_ACT |
... | ... | @@ -376,6 +375,7 @@ |
376 | 375 | #endif |
377 | 376 | |
378 | 377 | kmemcheck_bitfield_begin(flags2); |
378 | + __u16 queue_mapping:16; | |
379 | 379 | #ifdef CONFIG_IPV6_NDISC_NODETYPE |
380 | 380 | __u8 ndisc_nodetype:2; |
381 | 381 | #endif |
... | ... | @@ -1768,6 +1768,8 @@ |
1768 | 1768 | int to_offset, |
1769 | 1769 | int size); |
1770 | 1770 | extern void skb_free_datagram(struct sock *sk, struct sk_buff *skb); |
1771 | +extern void skb_free_datagram_locked(struct sock *sk, | |
1772 | + struct sk_buff *skb); | |
1771 | 1773 | extern int skb_kill_datagram(struct sock *sk, struct sk_buff *skb, |
1772 | 1774 | unsigned int flags); |
1773 | 1775 | extern __wsum skb_checksum(const struct sk_buff *skb, int offset, |
include/net/ip_fib.h
... | ... | @@ -213,7 +213,8 @@ |
213 | 213 | extern const struct nla_policy rtm_ipv4_policy[]; |
214 | 214 | extern void ip_fib_init(void); |
215 | 215 | extern int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif, |
216 | - struct net_device *dev, __be32 *spec_dst, u32 *itag); | |
216 | + struct net_device *dev, __be32 *spec_dst, | |
217 | + u32 *itag, u32 mark); | |
217 | 218 | extern void fib_select_default(struct net *net, const struct flowi *flp, |
218 | 219 | struct fib_result *res); |
219 | 220 |
include/net/netfilter/nf_conntrack.h
... | ... | @@ -255,11 +255,9 @@ |
255 | 255 | } |
256 | 256 | |
257 | 257 | /* These are for NAT. Icky. */ |
258 | -/* Update TCP window tracking data when NAT mangles the packet */ | |
259 | -extern void nf_conntrack_tcp_update(const struct sk_buff *skb, | |
260 | - unsigned int dataoff, | |
261 | - struct nf_conn *ct, int dir, | |
262 | - s16 offset); | |
258 | +extern s16 (*nf_ct_nat_offset)(const struct nf_conn *ct, | |
259 | + enum ip_conntrack_dir dir, | |
260 | + u32 seq); | |
263 | 261 | |
264 | 262 | /* Fake conntrack entry for untracked connections */ |
265 | 263 | extern struct nf_conn nf_conntrack_untracked; |
include/net/netfilter/nf_nat_helper.h
net/bridge/br_if.c
... | ... | @@ -377,12 +377,16 @@ |
377 | 377 | struct net_bridge_port *p; |
378 | 378 | int err = 0; |
379 | 379 | |
380 | - if (dev->flags & IFF_LOOPBACK || dev->type != ARPHRD_ETHER) | |
380 | + /* Don't allow bridging non-ethernet like devices */ | |
381 | + if ((dev->flags & IFF_LOOPBACK) || | |
382 | + dev->type != ARPHRD_ETHER || dev->addr_len != ETH_ALEN) | |
381 | 383 | return -EINVAL; |
382 | 384 | |
385 | + /* No bridging of bridges */ | |
383 | 386 | if (dev->netdev_ops->ndo_start_xmit == br_dev_xmit) |
384 | 387 | return -ELOOP; |
385 | 388 | |
389 | + /* Device is already being bridged */ | |
386 | 390 | if (dev->br_port != NULL) |
387 | 391 | return -EBUSY; |
388 | 392 |
net/core/datagram.c
... | ... | @@ -224,7 +224,16 @@ |
224 | 224 | consume_skb(skb); |
225 | 225 | sk_mem_reclaim_partial(sk); |
226 | 226 | } |
227 | +EXPORT_SYMBOL(skb_free_datagram); | |
227 | 228 | |
229 | +void skb_free_datagram_locked(struct sock *sk, struct sk_buff *skb) | |
230 | +{ | |
231 | + lock_sock(sk); | |
232 | + skb_free_datagram(sk, skb); | |
233 | + release_sock(sk); | |
234 | +} | |
235 | +EXPORT_SYMBOL(skb_free_datagram_locked); | |
236 | + | |
228 | 237 | /** |
229 | 238 | * skb_kill_datagram - Free a datagram skbuff forcibly |
230 | 239 | * @sk: socket |
... | ... | @@ -753,6 +762,5 @@ |
753 | 762 | EXPORT_SYMBOL(datagram_poll); |
754 | 763 | EXPORT_SYMBOL(skb_copy_and_csum_datagram_iovec); |
755 | 764 | EXPORT_SYMBOL(skb_copy_datagram_iovec); |
756 | -EXPORT_SYMBOL(skb_free_datagram); | |
757 | 765 | EXPORT_SYMBOL(skb_recv_datagram); |
net/decnet/sysctl_net_decnet.c
... | ... | @@ -263,11 +263,10 @@ |
263 | 263 | return -ENODEV; |
264 | 264 | |
265 | 265 | rv = -ENODEV; |
266 | - if (dev->dn_ptr != NULL) { | |
266 | + if (dev->dn_ptr != NULL) | |
267 | 267 | rv = dn_dev_set_default(dev, 1); |
268 | - if (rv) | |
269 | - dev_put(dev); | |
270 | - } | |
268 | + if (rv) | |
269 | + dev_put(dev); | |
271 | 270 | } |
272 | 271 | |
273 | 272 | return rv; |
net/ipv4/fib_frontend.c
... | ... | @@ -229,14 +229,17 @@ |
229 | 229 | */ |
230 | 230 | |
231 | 231 | int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif, |
232 | - struct net_device *dev, __be32 *spec_dst, u32 *itag) | |
232 | + struct net_device *dev, __be32 *spec_dst, | |
233 | + u32 *itag, u32 mark) | |
233 | 234 | { |
234 | 235 | struct in_device *in_dev; |
235 | 236 | struct flowi fl = { .nl_u = { .ip4_u = |
236 | 237 | { .daddr = src, |
237 | 238 | .saddr = dst, |
238 | 239 | .tos = tos } }, |
240 | + .mark = mark, | |
239 | 241 | .iif = oif }; |
242 | + | |
240 | 243 | struct fib_result res; |
241 | 244 | int no_addr, rpf; |
242 | 245 | int ret; |
net/ipv4/ip_gre.c
... | ... | @@ -1476,7 +1476,7 @@ |
1476 | 1476 | |
1477 | 1477 | ether_setup(dev); |
1478 | 1478 | |
1479 | - dev->netdev_ops = &ipgre_netdev_ops; | |
1479 | + dev->netdev_ops = &ipgre_tap_netdev_ops; | |
1480 | 1480 | dev->destructor = free_netdev; |
1481 | 1481 | |
1482 | 1482 | dev->iflink = 0; |
1483 | 1483 | |
1484 | 1484 | |
1485 | 1485 | |
1486 | 1486 | |
... | ... | @@ -1537,25 +1537,29 @@ |
1537 | 1537 | if (t->dev != dev) |
1538 | 1538 | return -EEXIST; |
1539 | 1539 | } else { |
1540 | - unsigned nflags = 0; | |
1541 | - | |
1542 | 1540 | t = nt; |
1543 | 1541 | |
1544 | - if (ipv4_is_multicast(p.iph.daddr)) | |
1545 | - nflags = IFF_BROADCAST; | |
1546 | - else if (p.iph.daddr) | |
1547 | - nflags = IFF_POINTOPOINT; | |
1542 | + if (dev->type != ARPHRD_ETHER) { | |
1543 | + unsigned nflags = 0; | |
1548 | 1544 | |
1549 | - if ((dev->flags ^ nflags) & | |
1550 | - (IFF_POINTOPOINT | IFF_BROADCAST)) | |
1551 | - return -EINVAL; | |
1545 | + if (ipv4_is_multicast(p.iph.daddr)) | |
1546 | + nflags = IFF_BROADCAST; | |
1547 | + else if (p.iph.daddr) | |
1548 | + nflags = IFF_POINTOPOINT; | |
1552 | 1549 | |
1550 | + if ((dev->flags ^ nflags) & | |
1551 | + (IFF_POINTOPOINT | IFF_BROADCAST)) | |
1552 | + return -EINVAL; | |
1553 | + } | |
1554 | + | |
1553 | 1555 | ipgre_tunnel_unlink(ign, t); |
1554 | 1556 | t->parms.iph.saddr = p.iph.saddr; |
1555 | 1557 | t->parms.iph.daddr = p.iph.daddr; |
1556 | 1558 | t->parms.i_key = p.i_key; |
1557 | - memcpy(dev->dev_addr, &p.iph.saddr, 4); | |
1558 | - memcpy(dev->broadcast, &p.iph.daddr, 4); | |
1559 | + if (dev->type != ARPHRD_ETHER) { | |
1560 | + memcpy(dev->dev_addr, &p.iph.saddr, 4); | |
1561 | + memcpy(dev->broadcast, &p.iph.daddr, 4); | |
1562 | + } | |
1559 | 1563 | ipgre_tunnel_link(ign, t); |
1560 | 1564 | netdev_state_change(dev); |
1561 | 1565 | } |
net/ipv4/netfilter/nf_nat_core.c
... | ... | @@ -750,6 +750,8 @@ |
750 | 750 | BUG_ON(nfnetlink_parse_nat_setup_hook != NULL); |
751 | 751 | rcu_assign_pointer(nfnetlink_parse_nat_setup_hook, |
752 | 752 | nfnetlink_parse_nat_setup); |
753 | + BUG_ON(nf_ct_nat_offset != NULL); | |
754 | + rcu_assign_pointer(nf_ct_nat_offset, nf_nat_get_offset); | |
753 | 755 | return 0; |
754 | 756 | |
755 | 757 | cleanup_extend: |
... | ... | @@ -764,6 +766,7 @@ |
764 | 766 | nf_ct_extend_unregister(&nat_extend); |
765 | 767 | rcu_assign_pointer(nf_nat_seq_adjust_hook, NULL); |
766 | 768 | rcu_assign_pointer(nfnetlink_parse_nat_setup_hook, NULL); |
769 | + rcu_assign_pointer(nf_ct_nat_offset, NULL); | |
767 | 770 | synchronize_net(); |
768 | 771 | } |
769 | 772 |
net/ipv4/netfilter/nf_nat_helper.c
... | ... | @@ -73,6 +73,28 @@ |
73 | 73 | DUMP_OFFSET(this_way); |
74 | 74 | } |
75 | 75 | |
76 | +/* Get the offset value, for conntrack */ | |
77 | +s16 nf_nat_get_offset(const struct nf_conn *ct, | |
78 | + enum ip_conntrack_dir dir, | |
79 | + u32 seq) | |
80 | +{ | |
81 | + struct nf_conn_nat *nat = nfct_nat(ct); | |
82 | + struct nf_nat_seq *this_way; | |
83 | + s16 offset; | |
84 | + | |
85 | + if (!nat) | |
86 | + return 0; | |
87 | + | |
88 | + this_way = &nat->seq[dir]; | |
89 | + spin_lock_bh(&nf_nat_seqofs_lock); | |
90 | + offset = after(seq, this_way->correction_pos) | |
91 | + ? this_way->offset_after : this_way->offset_before; | |
92 | + spin_unlock_bh(&nf_nat_seqofs_lock); | |
93 | + | |
94 | + return offset; | |
95 | +} | |
96 | +EXPORT_SYMBOL_GPL(nf_nat_get_offset); | |
97 | + | |
76 | 98 | /* Frobs data inside this packet, which is linear. */ |
77 | 99 | static void mangle_contents(struct sk_buff *skb, |
78 | 100 | unsigned int dataoff, |
... | ... | @@ -189,11 +211,6 @@ |
189 | 211 | adjust_tcp_sequence(ntohl(tcph->seq), |
190 | 212 | (int)rep_len - (int)match_len, |
191 | 213 | ct, ctinfo); |
192 | - /* Tell TCP window tracking about seq change */ | |
193 | - nf_conntrack_tcp_update(skb, ip_hdrlen(skb), | |
194 | - ct, CTINFO2DIR(ctinfo), | |
195 | - (int)rep_len - (int)match_len); | |
196 | - | |
197 | 214 | nf_conntrack_event_cache(IPCT_NATSEQADJ, ct); |
198 | 215 | } |
199 | 216 | return 1; |
... | ... | @@ -415,12 +432,7 @@ |
415 | 432 | tcph->seq = newseq; |
416 | 433 | tcph->ack_seq = newack; |
417 | 434 | |
418 | - if (!nf_nat_sack_adjust(skb, tcph, ct, ctinfo)) | |
419 | - return 0; | |
420 | - | |
421 | - nf_conntrack_tcp_update(skb, ip_hdrlen(skb), ct, dir, seqoff); | |
422 | - | |
423 | - return 1; | |
435 | + return nf_nat_sack_adjust(skb, tcph, ct, ctinfo); | |
424 | 436 | } |
425 | 437 | |
426 | 438 | /* Setup NAT on this expected conntrack so it follows master. */ |
net/ipv4/route.c
... | ... | @@ -1851,7 +1851,7 @@ |
1851 | 1851 | goto e_inval; |
1852 | 1852 | spec_dst = inet_select_addr(dev, 0, RT_SCOPE_LINK); |
1853 | 1853 | } else if (fib_validate_source(saddr, 0, tos, 0, |
1854 | - dev, &spec_dst, &itag) < 0) | |
1854 | + dev, &spec_dst, &itag, 0) < 0) | |
1855 | 1855 | goto e_inval; |
1856 | 1856 | |
1857 | 1857 | rth = dst_alloc(&ipv4_dst_ops); |
... | ... | @@ -1964,7 +1964,7 @@ |
1964 | 1964 | |
1965 | 1965 | |
1966 | 1966 | err = fib_validate_source(saddr, daddr, tos, FIB_RES_OIF(*res), |
1967 | - in_dev->dev, &spec_dst, &itag); | |
1967 | + in_dev->dev, &spec_dst, &itag, skb->mark); | |
1968 | 1968 | if (err < 0) { |
1969 | 1969 | ip_handle_martian_source(in_dev->dev, in_dev, skb, daddr, |
1970 | 1970 | saddr); |
... | ... | @@ -2138,7 +2138,7 @@ |
2138 | 2138 | int result; |
2139 | 2139 | result = fib_validate_source(saddr, daddr, tos, |
2140 | 2140 | net->loopback_dev->ifindex, |
2141 | - dev, &spec_dst, &itag); | |
2141 | + dev, &spec_dst, &itag, skb->mark); | |
2142 | 2142 | if (result < 0) |
2143 | 2143 | goto martian_source; |
2144 | 2144 | if (result) |
... | ... | @@ -2167,7 +2167,7 @@ |
2167 | 2167 | spec_dst = inet_select_addr(dev, 0, RT_SCOPE_LINK); |
2168 | 2168 | else { |
2169 | 2169 | err = fib_validate_source(saddr, 0, tos, 0, dev, &spec_dst, |
2170 | - &itag); | |
2170 | + &itag, skb->mark); | |
2171 | 2171 | if (err < 0) |
2172 | 2172 | goto martian_source; |
2173 | 2173 | if (err) |
net/ipv4/udp.c
net/ipv6/udp.c
net/mac80211/agg-tx.c
... | ... | @@ -666,26 +666,25 @@ |
666 | 666 | |
667 | 667 | state = &sta->ampdu_mlme.tid_state_tx[tid]; |
668 | 668 | |
669 | + del_timer_sync(&sta->ampdu_mlme.tid_tx[tid]->addba_resp_timer); | |
670 | + | |
669 | 671 | spin_lock_bh(&sta->lock); |
670 | 672 | |
671 | - if (!(*state & HT_ADDBA_REQUESTED_MSK)) { | |
672 | - spin_unlock_bh(&sta->lock); | |
673 | - return; | |
674 | - } | |
673 | + if (!(*state & HT_ADDBA_REQUESTED_MSK)) | |
674 | + goto timer_still_needed; | |
675 | 675 | |
676 | 676 | if (mgmt->u.action.u.addba_resp.dialog_token != |
677 | 677 | sta->ampdu_mlme.tid_tx[tid]->dialog_token) { |
678 | - spin_unlock_bh(&sta->lock); | |
679 | 678 | #ifdef CONFIG_MAC80211_HT_DEBUG |
680 | 679 | printk(KERN_DEBUG "wrong addBA response token, tid %d\n", tid); |
681 | 680 | #endif /* CONFIG_MAC80211_HT_DEBUG */ |
682 | - return; | |
681 | + goto timer_still_needed; | |
683 | 682 | } |
684 | 683 | |
685 | - del_timer_sync(&sta->ampdu_mlme.tid_tx[tid]->addba_resp_timer); | |
686 | 684 | #ifdef CONFIG_MAC80211_HT_DEBUG |
687 | 685 | printk(KERN_DEBUG "switched off addBA timer for tid %d \n", tid); |
688 | 686 | #endif /* CONFIG_MAC80211_HT_DEBUG */ |
687 | + | |
689 | 688 | if (le16_to_cpu(mgmt->u.action.u.addba_resp.status) |
690 | 689 | == WLAN_STATUS_SUCCESS) { |
691 | 690 | u8 curstate = *state; |
... | ... | @@ -699,6 +698,12 @@ |
699 | 698 | } else { |
700 | 699 | ___ieee80211_stop_tx_ba_session(sta, tid, WLAN_BACK_INITIATOR); |
701 | 700 | } |
701 | + | |
702 | + goto out; | |
703 | + | |
704 | + timer_still_needed: | |
705 | + add_timer(&sta->ampdu_mlme.tid_tx[tid]->addba_resp_timer); | |
706 | + out: | |
702 | 707 | spin_unlock_bh(&sta->lock); |
703 | 708 | } |
net/mac80211/cfg.c
... | ... | @@ -72,6 +72,9 @@ |
72 | 72 | struct ieee80211_sub_if_data *sdata; |
73 | 73 | int ret; |
74 | 74 | |
75 | + if (netif_running(dev)) | |
76 | + return -EBUSY; | |
77 | + | |
75 | 78 | if (!nl80211_type_check(type)) |
76 | 79 | return -EINVAL; |
77 | 80 | |
... | ... | @@ -80,9 +83,6 @@ |
80 | 83 | ret = ieee80211_if_change_type(sdata, type); |
81 | 84 | if (ret) |
82 | 85 | return ret; |
83 | - | |
84 | - if (netif_running(sdata->dev)) | |
85 | - return -EBUSY; | |
86 | 86 | |
87 | 87 | if (ieee80211_vif_is_mesh(&sdata->vif) && params->mesh_id_len) |
88 | 88 | ieee80211_sdata_set_mesh_id(sdata, |
net/mac80211/ht.c
... | ... | @@ -153,7 +153,7 @@ |
153 | 153 | if (net_ratelimit()) |
154 | 154 | printk(KERN_DEBUG "delba from %pM (%s) tid %d reason code %d\n", |
155 | 155 | mgmt->sa, initiator ? "initiator" : "recipient", tid, |
156 | - mgmt->u.action.u.delba.reason_code); | |
156 | + le16_to_cpu(mgmt->u.action.u.delba.reason_code)); | |
157 | 157 | #endif /* CONFIG_MAC80211_HT_DEBUG */ |
158 | 158 | |
159 | 159 | if (initiator == WLAN_BACK_INITIATOR) |
net/mac80211/ibss.c
... | ... | @@ -73,6 +73,7 @@ |
73 | 73 | struct ieee80211_mgmt *mgmt; |
74 | 74 | u8 *pos; |
75 | 75 | struct ieee80211_supported_band *sband; |
76 | + struct cfg80211_bss *bss; | |
76 | 77 | u32 bss_change; |
77 | 78 | u8 supp_rates[IEEE80211_MAX_SUPP_RATES]; |
78 | 79 | |
... | ... | @@ -177,8 +178,9 @@ |
177 | 178 | mod_timer(&ifibss->timer, |
178 | 179 | round_jiffies(jiffies + IEEE80211_IBSS_MERGE_INTERVAL)); |
179 | 180 | |
180 | - cfg80211_inform_bss_frame(local->hw.wiphy, local->hw.conf.channel, | |
181 | - mgmt, skb->len, 0, GFP_KERNEL); | |
181 | + bss = cfg80211_inform_bss_frame(local->hw.wiphy, local->hw.conf.channel, | |
182 | + mgmt, skb->len, 0, GFP_KERNEL); | |
183 | + cfg80211_put_bss(bss); | |
182 | 184 | cfg80211_ibss_joined(sdata->dev, ifibss->bssid, GFP_KERNEL); |
183 | 185 | } |
184 | 186 |
net/netfilter/nf_conntrack_core.c
... | ... | @@ -1350,6 +1350,11 @@ |
1350 | 1350 | return ret; |
1351 | 1351 | } |
1352 | 1352 | |
1353 | +s16 (*nf_ct_nat_offset)(const struct nf_conn *ct, | |
1354 | + enum ip_conntrack_dir dir, | |
1355 | + u32 seq); | |
1356 | +EXPORT_SYMBOL_GPL(nf_ct_nat_offset); | |
1357 | + | |
1353 | 1358 | int nf_conntrack_init(struct net *net) |
1354 | 1359 | { |
1355 | 1360 | int ret; |
... | ... | @@ -1367,6 +1372,9 @@ |
1367 | 1372 | /* For use by REJECT target */ |
1368 | 1373 | rcu_assign_pointer(ip_ct_attach, nf_conntrack_attach); |
1369 | 1374 | rcu_assign_pointer(nf_ct_destroy, destroy_conntrack); |
1375 | + | |
1376 | + /* Howto get NAT offsets */ | |
1377 | + rcu_assign_pointer(nf_ct_nat_offset, NULL); | |
1370 | 1378 | } |
1371 | 1379 | return 0; |
1372 | 1380 |
net/netfilter/nf_conntrack_proto_tcp.c
... | ... | @@ -492,6 +492,21 @@ |
492 | 492 | } |
493 | 493 | } |
494 | 494 | |
495 | +#ifdef CONFIG_NF_NAT_NEEDED | |
496 | +static inline s16 nat_offset(const struct nf_conn *ct, | |
497 | + enum ip_conntrack_dir dir, | |
498 | + u32 seq) | |
499 | +{ | |
500 | + typeof(nf_ct_nat_offset) get_offset = rcu_dereference(nf_ct_nat_offset); | |
501 | + | |
502 | + return get_offset != NULL ? get_offset(ct, dir, seq) : 0; | |
503 | +} | |
504 | +#define NAT_OFFSET(pf, ct, dir, seq) \ | |
505 | + (pf == NFPROTO_IPV4 ? nat_offset(ct, dir, seq) : 0) | |
506 | +#else | |
507 | +#define NAT_OFFSET(pf, ct, dir, seq) 0 | |
508 | +#endif | |
509 | + | |
495 | 510 | static bool tcp_in_window(const struct nf_conn *ct, |
496 | 511 | struct ip_ct_tcp *state, |
497 | 512 | enum ip_conntrack_dir dir, |
... | ... | @@ -506,6 +521,7 @@ |
506 | 521 | struct ip_ct_tcp_state *receiver = &state->seen[!dir]; |
507 | 522 | const struct nf_conntrack_tuple *tuple = &ct->tuplehash[dir].tuple; |
508 | 523 | __u32 seq, ack, sack, end, win, swin; |
524 | + s16 receiver_offset; | |
509 | 525 | bool res; |
510 | 526 | |
511 | 527 | /* |
512 | 528 | |
... | ... | @@ -519,11 +535,16 @@ |
519 | 535 | if (receiver->flags & IP_CT_TCP_FLAG_SACK_PERM) |
520 | 536 | tcp_sack(skb, dataoff, tcph, &sack); |
521 | 537 | |
538 | + /* Take into account NAT sequence number mangling */ | |
539 | + receiver_offset = NAT_OFFSET(pf, ct, !dir, ack - 1); | |
540 | + ack -= receiver_offset; | |
541 | + sack -= receiver_offset; | |
542 | + | |
522 | 543 | pr_debug("tcp_in_window: START\n"); |
523 | 544 | pr_debug("tcp_in_window: "); |
524 | 545 | nf_ct_dump_tuple(tuple); |
525 | - pr_debug("seq=%u ack=%u sack=%u win=%u end=%u\n", | |
526 | - seq, ack, sack, win, end); | |
546 | + pr_debug("seq=%u ack=%u+(%d) sack=%u+(%d) win=%u end=%u\n", | |
547 | + seq, ack, receiver_offset, sack, receiver_offset, win, end); | |
527 | 548 | pr_debug("tcp_in_window: sender end=%u maxend=%u maxwin=%u scale=%i " |
528 | 549 | "receiver end=%u maxend=%u maxwin=%u scale=%i\n", |
529 | 550 | sender->td_end, sender->td_maxend, sender->td_maxwin, |
... | ... | @@ -613,8 +634,8 @@ |
613 | 634 | |
614 | 635 | pr_debug("tcp_in_window: "); |
615 | 636 | nf_ct_dump_tuple(tuple); |
616 | - pr_debug("seq=%u ack=%u sack =%u win=%u end=%u\n", | |
617 | - seq, ack, sack, win, end); | |
637 | + pr_debug("seq=%u ack=%u+(%d) sack=%u+(%d) win=%u end=%u\n", | |
638 | + seq, ack, receiver_offset, sack, receiver_offset, win, end); | |
618 | 639 | pr_debug("tcp_in_window: sender end=%u maxend=%u maxwin=%u scale=%i " |
619 | 640 | "receiver end=%u maxend=%u maxwin=%u scale=%i\n", |
620 | 641 | sender->td_end, sender->td_maxend, sender->td_maxwin, |
... | ... | @@ -700,7 +721,7 @@ |
700 | 721 | before(seq, sender->td_maxend + 1) ? |
701 | 722 | after(end, sender->td_end - receiver->td_maxwin - 1) ? |
702 | 723 | before(sack, receiver->td_end + 1) ? |
703 | - after(ack, receiver->td_end - MAXACKWINDOW(sender)) ? "BUG" | |
724 | + after(sack, receiver->td_end - MAXACKWINDOW(sender) - 1) ? "BUG" | |
704 | 725 | : "ACK is under the lower bound (possible overly delayed ACK)" |
705 | 726 | : "ACK is over the upper bound (ACKed data not seen yet)" |
706 | 727 | : "SEQ is under the lower bound (already ACKed data retransmitted)" |
... | ... | @@ -714,39 +735,6 @@ |
714 | 735 | |
715 | 736 | return res; |
716 | 737 | } |
717 | - | |
718 | -#ifdef CONFIG_NF_NAT_NEEDED | |
719 | -/* Update sender->td_end after NAT successfully mangled the packet */ | |
720 | -/* Caller must linearize skb at tcp header. */ | |
721 | -void nf_conntrack_tcp_update(const struct sk_buff *skb, | |
722 | - unsigned int dataoff, | |
723 | - struct nf_conn *ct, int dir, | |
724 | - s16 offset) | |
725 | -{ | |
726 | - const struct tcphdr *tcph = (const void *)skb->data + dataoff; | |
727 | - const struct ip_ct_tcp_state *sender = &ct->proto.tcp.seen[dir]; | |
728 | - const struct ip_ct_tcp_state *receiver = &ct->proto.tcp.seen[!dir]; | |
729 | - __u32 end; | |
730 | - | |
731 | - end = segment_seq_plus_len(ntohl(tcph->seq), skb->len, dataoff, tcph); | |
732 | - | |
733 | - spin_lock_bh(&ct->lock); | |
734 | - /* | |
735 | - * We have to worry for the ack in the reply packet only... | |
736 | - */ | |
737 | - if (ct->proto.tcp.seen[dir].td_end + offset == end) | |
738 | - ct->proto.tcp.seen[dir].td_end = end; | |
739 | - ct->proto.tcp.last_end = end; | |
740 | - spin_unlock_bh(&ct->lock); | |
741 | - pr_debug("tcp_update: sender end=%u maxend=%u maxwin=%u scale=%i " | |
742 | - "receiver end=%u maxend=%u maxwin=%u scale=%i\n", | |
743 | - sender->td_end, sender->td_maxend, sender->td_maxwin, | |
744 | - sender->td_scale, | |
745 | - receiver->td_end, receiver->td_maxend, receiver->td_maxwin, | |
746 | - receiver->td_scale); | |
747 | -} | |
748 | -EXPORT_SYMBOL_GPL(nf_conntrack_tcp_update); | |
749 | -#endif | |
750 | 738 | |
751 | 739 | #define TH_FIN 0x01 |
752 | 740 | #define TH_SYN 0x02 |
net/rose/rose_route.c
... | ... | @@ -578,18 +578,18 @@ |
578 | 578 | |
579 | 579 | /* |
580 | 580 | * Check that the device given is a valid AX.25 interface that is "up". |
581 | + * called whith RTNL | |
581 | 582 | */ |
582 | -static struct net_device *rose_ax25_dev_get(char *devname) | |
583 | +static struct net_device *rose_ax25_dev_find(char *devname) | |
583 | 584 | { |
584 | 585 | struct net_device *dev; |
585 | 586 | |
586 | - if ((dev = dev_get_by_name(&init_net, devname)) == NULL) | |
587 | + if ((dev = __dev_get_by_name(&init_net, devname)) == NULL) | |
587 | 588 | return NULL; |
588 | 589 | |
589 | 590 | if ((dev->flags & IFF_UP) && dev->type == ARPHRD_AX25) |
590 | 591 | return dev; |
591 | 592 | |
592 | - dev_put(dev); | |
593 | 593 | return NULL; |
594 | 594 | } |
595 | 595 | |
596 | 596 | |
597 | 597 | |
598 | 598 | |
599 | 599 | |
600 | 600 | |
... | ... | @@ -720,27 +720,23 @@ |
720 | 720 | case SIOCADDRT: |
721 | 721 | if (copy_from_user(&rose_route, arg, sizeof(struct rose_route_struct))) |
722 | 722 | return -EFAULT; |
723 | - if ((dev = rose_ax25_dev_get(rose_route.device)) == NULL) | |
723 | + if ((dev = rose_ax25_dev_find(rose_route.device)) == NULL) | |
724 | 724 | return -EINVAL; |
725 | - if (rose_dev_exists(&rose_route.address)) { /* Can't add routes to ourself */ | |
726 | - dev_put(dev); | |
725 | + if (rose_dev_exists(&rose_route.address)) /* Can't add routes to ourself */ | |
727 | 726 | return -EINVAL; |
728 | - } | |
729 | 727 | if (rose_route.mask > 10) /* Mask can't be more than 10 digits */ |
730 | 728 | return -EINVAL; |
731 | 729 | if (rose_route.ndigis > AX25_MAX_DIGIS) |
732 | 730 | return -EINVAL; |
733 | 731 | err = rose_add_node(&rose_route, dev); |
734 | - dev_put(dev); | |
735 | 732 | return err; |
736 | 733 | |
737 | 734 | case SIOCDELRT: |
738 | 735 | if (copy_from_user(&rose_route, arg, sizeof(struct rose_route_struct))) |
739 | 736 | return -EFAULT; |
740 | - if ((dev = rose_ax25_dev_get(rose_route.device)) == NULL) | |
737 | + if ((dev = rose_ax25_dev_find(rose_route.device)) == NULL) | |
741 | 738 | return -EINVAL; |
742 | 739 | err = rose_del_node(&rose_route, dev); |
743 | - dev_put(dev); | |
744 | 740 | return err; |
745 | 741 | |
746 | 742 | case SIOCRSCLRRT: |
net/sunrpc/svcsock.c
... | ... | @@ -111,7 +111,7 @@ |
111 | 111 | rqstp->rq_xprt_ctxt = NULL; |
112 | 112 | |
113 | 113 | dprintk("svc: service %p, releasing skb %p\n", rqstp, skb); |
114 | - skb_free_datagram(svsk->sk_sk, skb); | |
114 | + skb_free_datagram_locked(svsk->sk_sk, skb); | |
115 | 115 | } |
116 | 116 | } |
117 | 117 | |
... | ... | @@ -578,7 +578,7 @@ |
578 | 578 | "svc: received unknown control message %d/%d; " |
579 | 579 | "dropping RPC reply datagram\n", |
580 | 580 | cmh->cmsg_level, cmh->cmsg_type); |
581 | - skb_free_datagram(svsk->sk_sk, skb); | |
581 | + skb_free_datagram_locked(svsk->sk_sk, skb); | |
582 | 582 | return 0; |
583 | 583 | } |
584 | 584 | |
585 | 585 | |
586 | 586 | |
... | ... | @@ -588,18 +588,18 @@ |
588 | 588 | if (csum_partial_copy_to_xdr(&rqstp->rq_arg, skb)) { |
589 | 589 | local_bh_enable(); |
590 | 590 | /* checksum error */ |
591 | - skb_free_datagram(svsk->sk_sk, skb); | |
591 | + skb_free_datagram_locked(svsk->sk_sk, skb); | |
592 | 592 | return 0; |
593 | 593 | } |
594 | 594 | local_bh_enable(); |
595 | - skb_free_datagram(svsk->sk_sk, skb); | |
595 | + skb_free_datagram_locked(svsk->sk_sk, skb); | |
596 | 596 | } else { |
597 | 597 | /* we can use it in-place */ |
598 | 598 | rqstp->rq_arg.head[0].iov_base = skb->data + |
599 | 599 | sizeof(struct udphdr); |
600 | 600 | rqstp->rq_arg.head[0].iov_len = len; |
601 | 601 | if (skb_checksum_complete(skb)) { |
602 | - skb_free_datagram(svsk->sk_sk, skb); | |
602 | + skb_free_datagram_locked(svsk->sk_sk, skb); | |
603 | 603 | return 0; |
604 | 604 | } |
605 | 605 | rqstp->rq_xprt_ctxt = skb; |
net/wireless/sme.c
... | ... | @@ -165,7 +165,7 @@ |
165 | 165 | struct cfg80211_registered_device *rdev = |
166 | 166 | container_of(work, struct cfg80211_registered_device, conn_work); |
167 | 167 | struct wireless_dev *wdev; |
168 | - u8 bssid[ETH_ALEN]; | |
168 | + u8 bssid_buf[ETH_ALEN], *bssid = NULL; | |
169 | 169 | |
170 | 170 | rtnl_lock(); |
171 | 171 | cfg80211_lock_rdev(rdev); |
... | ... | @@ -181,7 +181,10 @@ |
181 | 181 | wdev_unlock(wdev); |
182 | 182 | continue; |
183 | 183 | } |
184 | - memcpy(bssid, wdev->conn->params.bssid, ETH_ALEN); | |
184 | + if (wdev->conn->params.bssid) { | |
185 | + memcpy(bssid_buf, wdev->conn->params.bssid, ETH_ALEN); | |
186 | + bssid = bssid_buf; | |
187 | + } | |
185 | 188 | if (cfg80211_conn_do_work(wdev)) |
186 | 189 | __cfg80211_connect_result( |
187 | 190 | wdev->netdev, bssid, |