mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 03:06:10 +00:00
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>
This commit is contained in:
commit
230f9bb701
62 changed files with 754 additions and 272 deletions
|
@ -3655,6 +3655,7 @@ L: netdev@vger.kernel.org
|
||||||
W: http://www.linuxfoundation.org/en/Net
|
W: http://www.linuxfoundation.org/en/Net
|
||||||
W: http://patchwork.ozlabs.org/project/netdev/list/
|
W: http://patchwork.ozlabs.org/project/netdev/list/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.git
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: net/
|
F: net/
|
||||||
F: include/net/
|
F: include/net/
|
||||||
|
|
|
@ -960,7 +960,8 @@ static int process_idi_event (diva_strace_context_t* pLib,
|
||||||
if (!strncmp("State\\Layer2 No1", path, pVar->path_length)) {
|
if (!strncmp("State\\Layer2 No1", path, pVar->path_length)) {
|
||||||
char* tmp = &pLib->lines[0].pInterface->Layer2[0];
|
char* tmp = &pLib->lines[0].pInterface->Layer2[0];
|
||||||
dword l2_state;
|
dword l2_state;
|
||||||
diva_strace_read_uint (pVar, &l2_state);
|
if (diva_strace_read_uint(pVar, &l2_state))
|
||||||
|
return -1;
|
||||||
|
|
||||||
switch (l2_state) {
|
switch (l2_state) {
|
||||||
case 0:
|
case 0:
|
||||||
|
|
|
@ -2692,7 +2692,7 @@ static byte connect_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
|
||||||
if (!(fax_control_bits & T30_CONTROL_BIT_MORE_DOCUMENTS)
|
if (!(fax_control_bits & T30_CONTROL_BIT_MORE_DOCUMENTS)
|
||||||
|| (fax_feature_bits & T30_FEATURE_BIT_MORE_DOCUMENTS))
|
|| (fax_feature_bits & T30_FEATURE_BIT_MORE_DOCUMENTS))
|
||||||
{
|
{
|
||||||
len = (byte)(&(((T30_INFO *) 0)->universal_6));
|
len = offsetof(T30_INFO, universal_6);
|
||||||
fax_info_change = false;
|
fax_info_change = false;
|
||||||
if (ncpi->length >= 4)
|
if (ncpi->length >= 4)
|
||||||
{
|
{
|
||||||
|
@ -2754,7 +2754,7 @@ static byte connect_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
|
||||||
for (i = 0; i < w; i++)
|
for (i = 0; i < w; i++)
|
||||||
((T30_INFO *)(plci->fax_connect_info_buffer))->station_id[i] = fax_parms[4].info[1+i];
|
((T30_INFO *)(plci->fax_connect_info_buffer))->station_id[i] = fax_parms[4].info[1+i];
|
||||||
((T30_INFO *)(plci->fax_connect_info_buffer))->head_line_len = 0;
|
((T30_INFO *)(plci->fax_connect_info_buffer))->head_line_len = 0;
|
||||||
len = (byte)(((T30_INFO *) 0)->station_id + 20);
|
len = offsetof(T30_INFO, station_id) + 20;
|
||||||
w = fax_parms[5].length;
|
w = fax_parms[5].length;
|
||||||
if (w > 20)
|
if (w > 20)
|
||||||
w = 20;
|
w = 20;
|
||||||
|
@ -2788,7 +2788,7 @@ static byte connect_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
len = (byte)(&(((T30_INFO *) 0)->universal_6));
|
len = offsetof(T30_INFO, universal_6);
|
||||||
}
|
}
|
||||||
fax_info_change = true;
|
fax_info_change = true;
|
||||||
|
|
||||||
|
@ -2892,7 +2892,7 @@ static byte connect_b3_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
|
||||||
&& (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_ENABLE_NSF)
|
&& (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_ENABLE_NSF)
|
||||||
&& (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_NEGOTIATE_RESP))
|
&& (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_NEGOTIATE_RESP))
|
||||||
{
|
{
|
||||||
len = ((byte)(((T30_INFO *) 0)->station_id + 20));
|
len = offsetof(T30_INFO, station_id) + 20;
|
||||||
if (plci->fax_connect_info_length < len)
|
if (plci->fax_connect_info_length < len)
|
||||||
{
|
{
|
||||||
((T30_INFO *)(plci->fax_connect_info_buffer))->station_id_len = 0;
|
((T30_INFO *)(plci->fax_connect_info_buffer))->station_id_len = 0;
|
||||||
|
@ -3802,7 +3802,7 @@ static byte manufacturer_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
ncpi = &m_parms[1];
|
ncpi = &m_parms[1];
|
||||||
len = ((byte)(((T30_INFO *) 0)->station_id + 20));
|
len = offsetof(T30_INFO, station_id) + 20;
|
||||||
if (plci->fax_connect_info_length < len)
|
if (plci->fax_connect_info_length < len)
|
||||||
{
|
{
|
||||||
((T30_INFO *)(plci->fax_connect_info_buffer))->station_id_len = 0;
|
((T30_INFO *)(plci->fax_connect_info_buffer))->station_id_len = 0;
|
||||||
|
@ -6844,7 +6844,7 @@ static void nl_ind(PLCI *plci)
|
||||||
if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[plci->appl->Id-1])
|
if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[plci->appl->Id-1])
|
||||||
& ((1L << PRIVATE_FAX_SUB_SEP_PWD) | (1L << PRIVATE_FAX_NONSTANDARD)))
|
& ((1L << PRIVATE_FAX_SUB_SEP_PWD) | (1L << PRIVATE_FAX_NONSTANDARD)))
|
||||||
{
|
{
|
||||||
i = ((word)(((T30_INFO *) 0)->station_id + 20)) + ((T30_INFO *)plci->NL.RBuffer->P)->head_line_len;
|
i = offsetof(T30_INFO, station_id) + 20 + ((T30_INFO *)plci->NL.RBuffer->P)->head_line_len;
|
||||||
while (i < plci->NL.RBuffer->length)
|
while (i < plci->NL.RBuffer->length)
|
||||||
plci->ncpi_buffer[++len] = plci->NL.RBuffer->P[i++];
|
plci->ncpi_buffer[++len] = plci->NL.RBuffer->P[i++];
|
||||||
}
|
}
|
||||||
|
@ -7236,7 +7236,7 @@ static void nl_ind(PLCI *plci)
|
||||||
{
|
{
|
||||||
plci->RData[1].P = plci->RData[0].P;
|
plci->RData[1].P = plci->RData[0].P;
|
||||||
plci->RData[1].PLength = plci->RData[0].PLength;
|
plci->RData[1].PLength = plci->RData[0].PLength;
|
||||||
plci->RData[0].P = v120_header_buffer + (-((int) v120_header_buffer) & 3);
|
plci->RData[0].P = v120_header_buffer + (-((unsigned long)v120_header_buffer) & 3);
|
||||||
if ((plci->NL.RBuffer->P[0] & V120_HEADER_EXTEND_BIT) || (plci->NL.RLength == 1))
|
if ((plci->NL.RBuffer->P[0] & V120_HEADER_EXTEND_BIT) || (plci->NL.RLength == 1))
|
||||||
plci->RData[0].PLength = 1;
|
plci->RData[0].PLength = 1;
|
||||||
else
|
else
|
||||||
|
@ -8473,7 +8473,7 @@ static word add_b23(PLCI *plci, API_PARSE *bp)
|
||||||
fax_control_bits |= T30_CONTROL_BIT_ACCEPT_SEL_POLLING;
|
fax_control_bits |= T30_CONTROL_BIT_ACCEPT_SEL_POLLING;
|
||||||
}
|
}
|
||||||
len = nlc[0];
|
len = nlc[0];
|
||||||
pos = ((byte)(((T30_INFO *) 0)->station_id + 20));
|
pos = offsetof(T30_INFO, station_id) + 20;
|
||||||
if (pos < plci->fax_connect_info_length)
|
if (pos < plci->fax_connect_info_length)
|
||||||
{
|
{
|
||||||
for (i = 1 + plci->fax_connect_info_buffer[pos]; i != 0; i--)
|
for (i = 1 + plci->fax_connect_info_buffer[pos]; i != 0; i--)
|
||||||
|
@ -8525,7 +8525,7 @@ static word add_b23(PLCI *plci, API_PARSE *bp)
|
||||||
}
|
}
|
||||||
|
|
||||||
PUT_WORD(&(((T30_INFO *)&nlc[1])->control_bits_low), fax_control_bits);
|
PUT_WORD(&(((T30_INFO *)&nlc[1])->control_bits_low), fax_control_bits);
|
||||||
len = ((byte)(((T30_INFO *) 0)->station_id + 20));
|
len = offsetof(T30_INFO, station_id) + 20;
|
||||||
for (i = 0; i < len; i++)
|
for (i = 0; i < len; i++)
|
||||||
plci->fax_connect_info_buffer[i] = nlc[1+i];
|
plci->fax_connect_info_buffer[i] = nlc[1+i];
|
||||||
((T30_INFO *) plci->fax_connect_info_buffer)->head_line_len = 0;
|
((T30_INFO *) plci->fax_connect_info_buffer)->head_line_len = 0;
|
||||||
|
|
|
@ -594,6 +594,7 @@ Amd7930_l1hw(struct PStack *st, int pr, void *arg)
|
||||||
if (cs->debug & L1_DEB_WARN)
|
if (cs->debug & L1_DEB_WARN)
|
||||||
debugl1(cs, "Amd7930: l1hw: l2l1 tx_skb exist this shouldn't happen");
|
debugl1(cs, "Amd7930: l1hw: l2l1 tx_skb exist this shouldn't happen");
|
||||||
skb_queue_tail(&cs->sq, skb);
|
skb_queue_tail(&cs->sq, skb);
|
||||||
|
spin_unlock_irqrestore(&cs->lock, flags);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (cs->debug & DEB_DLOG_HEX)
|
if (cs->debug & DEB_DLOG_HEX)
|
||||||
|
|
|
@ -382,7 +382,7 @@ MemwaitforXFW(struct IsdnCardState *cs, int hscx)
|
||||||
{
|
{
|
||||||
int to = 50;
|
int to = 50;
|
||||||
|
|
||||||
while ((!(MemReadHSCX(cs, hscx, HSCX_STAR) & 0x44) == 0x40) && to) {
|
while (((MemReadHSCX(cs, hscx, HSCX_STAR) & 0x44) != 0x40) && to) {
|
||||||
udelay(1);
|
udelay(1);
|
||||||
to--;
|
to--;
|
||||||
}
|
}
|
||||||
|
|
|
@ -817,8 +817,8 @@ collect_rx_frame(usb_fifo * fifo, __u8 * data, int len, int finish)
|
||||||
}
|
}
|
||||||
/* we have a complete hdlc packet */
|
/* we have a complete hdlc packet */
|
||||||
if (finish) {
|
if (finish) {
|
||||||
if ((!fifo->skbuff->data[fifo->skbuff->len - 1])
|
if (fifo->skbuff->len > 3 &&
|
||||||
&& (fifo->skbuff->len > 3)) {
|
!fifo->skbuff->data[fifo->skbuff->len - 1]) {
|
||||||
|
|
||||||
if (fifon == HFCUSB_D_RX) {
|
if (fifon == HFCUSB_D_RX) {
|
||||||
DBG(HFCUSB_DBG_DCHANNEL,
|
DBG(HFCUSB_DBG_DCHANNEL,
|
||||||
|
|
|
@ -32,7 +32,7 @@ waitforXFW(struct IsdnCardState *cs, int hscx)
|
||||||
{
|
{
|
||||||
int to = 50;
|
int to = 50;
|
||||||
|
|
||||||
while ((!(READHSCX(cs, hscx, HSCX_STAR) & 0x44) == 0x40) && to) {
|
while (((READHSCX(cs, hscx, HSCX_STAR) & 0x44) != 0x40) && to) {
|
||||||
udelay(1);
|
udelay(1);
|
||||||
to--;
|
to--;
|
||||||
}
|
}
|
||||||
|
|
|
@ -468,6 +468,7 @@ ICC_l1hw(struct PStack *st, int pr, void *arg)
|
||||||
if (cs->debug & L1_DEB_WARN)
|
if (cs->debug & L1_DEB_WARN)
|
||||||
debugl1(cs, " l2l1 tx_skb exist this shouldn't happen");
|
debugl1(cs, " l2l1 tx_skb exist this shouldn't happen");
|
||||||
skb_queue_tail(&cs->sq, skb);
|
skb_queue_tail(&cs->sq, skb);
|
||||||
|
spin_unlock_irqrestore(&cs->lock, flags);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (cs->debug & DEB_DLOG_HEX)
|
if (cs->debug & DEB_DLOG_HEX)
|
||||||
|
|
|
@ -364,7 +364,7 @@ add_layer2(struct mISDNchannel *ch, struct mISDNstack *st)
|
||||||
static int
|
static int
|
||||||
st_own_ctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
|
st_own_ctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
|
||||||
{
|
{
|
||||||
if (!ch->st || ch->st->layer1)
|
if (!ch->st || !ch->st->layer1)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
return ch->st->layer1->ctrl(ch->st->layer1, cmd, arg);
|
return ch->st->layer1->ctrl(ch->st->layer1, cmd, arg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,7 +68,7 @@ enum {
|
||||||
#define CQE_STATUS_COMPL_MASK 0xFFFF
|
#define CQE_STATUS_COMPL_MASK 0xFFFF
|
||||||
#define CQE_STATUS_COMPL_SHIFT 0 /* bits 0 - 15 */
|
#define CQE_STATUS_COMPL_SHIFT 0 /* bits 0 - 15 */
|
||||||
#define CQE_STATUS_EXTD_MASK 0xFFFF
|
#define CQE_STATUS_EXTD_MASK 0xFFFF
|
||||||
#define CQE_STATUS_EXTD_SHIFT 0 /* bits 0 - 15 */
|
#define CQE_STATUS_EXTD_SHIFT 16 /* bits 16 - 31 */
|
||||||
|
|
||||||
struct be_mcc_compl {
|
struct be_mcc_compl {
|
||||||
u32 status; /* dword 0 */
|
u32 status; /* dword 0 */
|
||||||
|
|
|
@ -2217,7 +2217,7 @@ void emac_poll_controller(struct net_device *ndev)
|
||||||
struct emac_priv *priv = netdev_priv(ndev);
|
struct emac_priv *priv = netdev_priv(ndev);
|
||||||
|
|
||||||
emac_int_disable(priv);
|
emac_int_disable(priv);
|
||||||
emac_irq(ndev->irq, priv);
|
emac_irq(ndev->irq, ndev);
|
||||||
emac_int_enable(priv);
|
emac_int_enable(priv);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1438,19 +1438,31 @@ static int e100_phy_init(struct nic *nic)
|
||||||
} else
|
} else
|
||||||
DPRINTK(HW, DEBUG, "phy_addr = %d\n", nic->mii.phy_id);
|
DPRINTK(HW, DEBUG, "phy_addr = %d\n", nic->mii.phy_id);
|
||||||
|
|
||||||
/* Isolate all the PHY ids */
|
|
||||||
for (addr = 0; addr < 32; addr++)
|
|
||||||
mdio_write(netdev, addr, MII_BMCR, BMCR_ISOLATE);
|
|
||||||
/* Select the discovered PHY */
|
|
||||||
bmcr &= ~BMCR_ISOLATE;
|
|
||||||
mdio_write(netdev, nic->mii.phy_id, MII_BMCR, bmcr);
|
|
||||||
|
|
||||||
/* Get phy ID */
|
/* Get phy ID */
|
||||||
id_lo = mdio_read(netdev, nic->mii.phy_id, MII_PHYSID1);
|
id_lo = mdio_read(netdev, nic->mii.phy_id, MII_PHYSID1);
|
||||||
id_hi = mdio_read(netdev, nic->mii.phy_id, MII_PHYSID2);
|
id_hi = mdio_read(netdev, nic->mii.phy_id, MII_PHYSID2);
|
||||||
nic->phy = (u32)id_hi << 16 | (u32)id_lo;
|
nic->phy = (u32)id_hi << 16 | (u32)id_lo;
|
||||||
DPRINTK(HW, DEBUG, "phy ID = 0x%08X\n", nic->phy);
|
DPRINTK(HW, DEBUG, "phy ID = 0x%08X\n", nic->phy);
|
||||||
|
|
||||||
|
/* Select the phy and isolate the rest */
|
||||||
|
for (addr = 0; addr < 32; addr++) {
|
||||||
|
if (addr != nic->mii.phy_id) {
|
||||||
|
mdio_write(netdev, addr, MII_BMCR, BMCR_ISOLATE);
|
||||||
|
} else if (nic->phy != phy_82552_v) {
|
||||||
|
bmcr = mdio_read(netdev, addr, MII_BMCR);
|
||||||
|
mdio_write(netdev, addr, MII_BMCR,
|
||||||
|
bmcr & ~BMCR_ISOLATE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Workaround for 82552:
|
||||||
|
* Clear the ISOLATE bit on selected phy_id last (mirrored on all
|
||||||
|
* other phy_id's) using bmcr value from addr discovery loop above.
|
||||||
|
*/
|
||||||
|
if (nic->phy == phy_82552_v)
|
||||||
|
mdio_write(netdev, nic->mii.phy_id, MII_BMCR,
|
||||||
|
bmcr & ~BMCR_ISOLATE);
|
||||||
|
|
||||||
/* Handle National tx phys */
|
/* Handle National tx phys */
|
||||||
#define NCS_PHY_MODEL_MASK 0xFFF0FFFF
|
#define NCS_PHY_MODEL_MASK 0xFFF0FFFF
|
||||||
if ((nic->phy & NCS_PHY_MODEL_MASK) == phy_nsc_tx) {
|
if ((nic->phy & NCS_PHY_MODEL_MASK) == phy_nsc_tx) {
|
||||||
|
|
|
@ -76,6 +76,7 @@
|
||||||
/* Extended Device Control */
|
/* Extended Device Control */
|
||||||
#define E1000_CTRL_EXT_SDP7_DATA 0x00000080 /* Value of SW Definable Pin 7 */
|
#define E1000_CTRL_EXT_SDP7_DATA 0x00000080 /* Value of SW Definable Pin 7 */
|
||||||
#define E1000_CTRL_EXT_EE_RST 0x00002000 /* Reinitialize from EEPROM */
|
#define E1000_CTRL_EXT_EE_RST 0x00002000 /* Reinitialize from EEPROM */
|
||||||
|
#define E1000_CTRL_EXT_SPD_BYPS 0x00008000 /* Speed Select Bypass */
|
||||||
#define E1000_CTRL_EXT_RO_DIS 0x00020000 /* Relaxed Ordering disable */
|
#define E1000_CTRL_EXT_RO_DIS 0x00020000 /* Relaxed Ordering disable */
|
||||||
#define E1000_CTRL_EXT_DMA_DYN_CLK_EN 0x00080000 /* DMA Dynamic Clock Gating */
|
#define E1000_CTRL_EXT_DMA_DYN_CLK_EN 0x00080000 /* DMA Dynamic Clock Gating */
|
||||||
#define E1000_CTRL_EXT_LINK_MODE_MASK 0x00C00000
|
#define E1000_CTRL_EXT_LINK_MODE_MASK 0x00C00000
|
||||||
|
@ -347,6 +348,7 @@
|
||||||
/* Extended Configuration Control and Size */
|
/* Extended Configuration Control and Size */
|
||||||
#define E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP 0x00000020
|
#define E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP 0x00000020
|
||||||
#define E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE 0x00000001
|
#define E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE 0x00000001
|
||||||
|
#define E1000_EXTCNF_CTRL_OEM_WRITE_ENABLE 0x00000008
|
||||||
#define E1000_EXTCNF_CTRL_SWFLAG 0x00000020
|
#define E1000_EXTCNF_CTRL_SWFLAG 0x00000020
|
||||||
#define E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_MASK 0x00FF0000
|
#define E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_MASK 0x00FF0000
|
||||||
#define E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_SHIFT 16
|
#define E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_SHIFT 16
|
||||||
|
|
|
@ -141,6 +141,20 @@ struct e1000_info;
|
||||||
#define HV_TNCRS_UPPER PHY_REG(778, 29) /* Transmit with no CRS */
|
#define HV_TNCRS_UPPER PHY_REG(778, 29) /* Transmit with no CRS */
|
||||||
#define HV_TNCRS_LOWER PHY_REG(778, 30)
|
#define HV_TNCRS_LOWER PHY_REG(778, 30)
|
||||||
|
|
||||||
|
/* BM PHY Copper Specific Status */
|
||||||
|
#define BM_CS_STATUS 17
|
||||||
|
#define BM_CS_STATUS_LINK_UP 0x0400
|
||||||
|
#define BM_CS_STATUS_RESOLVED 0x0800
|
||||||
|
#define BM_CS_STATUS_SPEED_MASK 0xC000
|
||||||
|
#define BM_CS_STATUS_SPEED_1000 0x8000
|
||||||
|
|
||||||
|
/* 82577 Mobile Phy Status Register */
|
||||||
|
#define HV_M_STATUS 26
|
||||||
|
#define HV_M_STATUS_AUTONEG_COMPLETE 0x1000
|
||||||
|
#define HV_M_STATUS_SPEED_MASK 0x0300
|
||||||
|
#define HV_M_STATUS_SPEED_1000 0x0200
|
||||||
|
#define HV_M_STATUS_LINK_UP 0x0040
|
||||||
|
|
||||||
enum e1000_boards {
|
enum e1000_boards {
|
||||||
board_82571,
|
board_82571,
|
||||||
board_82572,
|
board_82572,
|
||||||
|
|
|
@ -903,6 +903,7 @@ struct e1000_shadow_ram {
|
||||||
struct e1000_dev_spec_ich8lan {
|
struct e1000_dev_spec_ich8lan {
|
||||||
bool kmrn_lock_loss_workaround_enabled;
|
bool kmrn_lock_loss_workaround_enabled;
|
||||||
struct e1000_shadow_ram shadow_ram[E1000_ICH8_SHADOW_RAM_WORDS];
|
struct e1000_shadow_ram shadow_ram[E1000_ICH8_SHADOW_RAM_WORDS];
|
||||||
|
bool nvm_k1_enabled;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct e1000_hw {
|
struct e1000_hw {
|
||||||
|
|
|
@ -124,11 +124,25 @@
|
||||||
|
|
||||||
#define SW_FLAG_TIMEOUT 1000 /* SW Semaphore flag timeout in milliseconds */
|
#define SW_FLAG_TIMEOUT 1000 /* SW Semaphore flag timeout in milliseconds */
|
||||||
|
|
||||||
|
/* SMBus Address Phy Register */
|
||||||
|
#define HV_SMB_ADDR PHY_REG(768, 26)
|
||||||
|
#define HV_SMB_ADDR_PEC_EN 0x0200
|
||||||
|
#define HV_SMB_ADDR_VALID 0x0080
|
||||||
|
|
||||||
|
/* Strapping Option Register - RO */
|
||||||
|
#define E1000_STRAP 0x0000C
|
||||||
|
#define E1000_STRAP_SMBUS_ADDRESS_MASK 0x00FE0000
|
||||||
|
#define E1000_STRAP_SMBUS_ADDRESS_SHIFT 17
|
||||||
|
|
||||||
/* OEM Bits Phy Register */
|
/* OEM Bits Phy Register */
|
||||||
#define HV_OEM_BITS PHY_REG(768, 25)
|
#define HV_OEM_BITS PHY_REG(768, 25)
|
||||||
#define HV_OEM_BITS_LPLU 0x0004 /* Low Power Link Up */
|
#define HV_OEM_BITS_LPLU 0x0004 /* Low Power Link Up */
|
||||||
|
#define HV_OEM_BITS_GBE_DIS 0x0040 /* Gigabit Disable */
|
||||||
#define HV_OEM_BITS_RESTART_AN 0x0400 /* Restart Auto-negotiation */
|
#define HV_OEM_BITS_RESTART_AN 0x0400 /* Restart Auto-negotiation */
|
||||||
|
|
||||||
|
#define E1000_NVM_K1_CONFIG 0x1B /* NVM K1 Config Word */
|
||||||
|
#define E1000_NVM_K1_ENABLE 0x1 /* NVM Enable K1 bit */
|
||||||
|
|
||||||
/* ICH GbE Flash Hardware Sequencing Flash Status Register bit breakdown */
|
/* ICH GbE Flash Hardware Sequencing Flash Status Register bit breakdown */
|
||||||
/* Offset 04h HSFSTS */
|
/* Offset 04h HSFSTS */
|
||||||
union ich8_hws_flash_status {
|
union ich8_hws_flash_status {
|
||||||
|
@ -208,6 +222,9 @@ static s32 e1000_cleanup_led_pchlan(struct e1000_hw *hw);
|
||||||
static s32 e1000_led_on_pchlan(struct e1000_hw *hw);
|
static s32 e1000_led_on_pchlan(struct e1000_hw *hw);
|
||||||
static s32 e1000_led_off_pchlan(struct e1000_hw *hw);
|
static s32 e1000_led_off_pchlan(struct e1000_hw *hw);
|
||||||
static s32 e1000_set_lplu_state_pchlan(struct e1000_hw *hw, bool active);
|
static s32 e1000_set_lplu_state_pchlan(struct e1000_hw *hw, bool active);
|
||||||
|
static void e1000_lan_init_done_ich8lan(struct e1000_hw *hw);
|
||||||
|
static s32 e1000_k1_gig_workaround_hv(struct e1000_hw *hw, bool link);
|
||||||
|
static s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable);
|
||||||
|
|
||||||
static inline u16 __er16flash(struct e1000_hw *hw, unsigned long reg)
|
static inline u16 __er16flash(struct e1000_hw *hw, unsigned long reg)
|
||||||
{
|
{
|
||||||
|
@ -483,14 +500,6 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hw->mac.type == e1000_pchlan) {
|
|
||||||
ret_val = e1000e_write_kmrn_reg(hw,
|
|
||||||
E1000_KMRNCTRLSTA_K1_CONFIG,
|
|
||||||
E1000_KMRNCTRLSTA_K1_ENABLE);
|
|
||||||
if (ret_val)
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* First we want to see if the MII Status Register reports
|
* First we want to see if the MII Status Register reports
|
||||||
* link. If so, then we want to get the current speed/duplex
|
* link. If so, then we want to get the current speed/duplex
|
||||||
|
@ -500,6 +509,12 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
|
||||||
if (ret_val)
|
if (ret_val)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
if (hw->mac.type == e1000_pchlan) {
|
||||||
|
ret_val = e1000_k1_gig_workaround_hv(hw, link);
|
||||||
|
if (ret_val)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
if (!link)
|
if (!link)
|
||||||
goto out; /* No link detected */
|
goto out; /* No link detected */
|
||||||
|
|
||||||
|
@ -793,6 +808,326 @@ static s32 e1000_phy_force_speed_duplex_ich8lan(struct e1000_hw *hw)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* e1000_sw_lcd_config_ich8lan - SW-based LCD Configuration
|
||||||
|
* @hw: pointer to the HW structure
|
||||||
|
*
|
||||||
|
* SW should configure the LCD from the NVM extended configuration region
|
||||||
|
* as a workaround for certain parts.
|
||||||
|
**/
|
||||||
|
static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw)
|
||||||
|
{
|
||||||
|
struct e1000_phy_info *phy = &hw->phy;
|
||||||
|
u32 i, data, cnf_size, cnf_base_addr, sw_cfg_mask;
|
||||||
|
s32 ret_val;
|
||||||
|
u16 word_addr, reg_data, reg_addr, phy_page = 0;
|
||||||
|
|
||||||
|
ret_val = hw->phy.ops.acquire_phy(hw);
|
||||||
|
if (ret_val)
|
||||||
|
return ret_val;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize the PHY from the NVM on ICH platforms. This
|
||||||
|
* is needed due to an issue where the NVM configuration is
|
||||||
|
* not properly autoloaded after power transitions.
|
||||||
|
* Therefore, after each PHY reset, we will load the
|
||||||
|
* configuration data out of the NVM manually.
|
||||||
|
*/
|
||||||
|
if ((hw->mac.type == e1000_ich8lan && phy->type == e1000_phy_igp_3) ||
|
||||||
|
(hw->mac.type == e1000_pchlan)) {
|
||||||
|
struct e1000_adapter *adapter = hw->adapter;
|
||||||
|
|
||||||
|
/* Check if SW needs to configure the PHY */
|
||||||
|
if ((adapter->pdev->device == E1000_DEV_ID_ICH8_IGP_M_AMT) ||
|
||||||
|
(adapter->pdev->device == E1000_DEV_ID_ICH8_IGP_M) ||
|
||||||
|
(hw->mac.type == e1000_pchlan))
|
||||||
|
sw_cfg_mask = E1000_FEXTNVM_SW_CONFIG_ICH8M;
|
||||||
|
else
|
||||||
|
sw_cfg_mask = E1000_FEXTNVM_SW_CONFIG;
|
||||||
|
|
||||||
|
data = er32(FEXTNVM);
|
||||||
|
if (!(data & sw_cfg_mask))
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
/* Wait for basic configuration completes before proceeding */
|
||||||
|
e1000_lan_init_done_ich8lan(hw);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure HW does not configure LCD from PHY
|
||||||
|
* extended configuration before SW configuration
|
||||||
|
*/
|
||||||
|
data = er32(EXTCNF_CTRL);
|
||||||
|
if (data & E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
cnf_size = er32(EXTCNF_SIZE);
|
||||||
|
cnf_size &= E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_MASK;
|
||||||
|
cnf_size >>= E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_SHIFT;
|
||||||
|
if (!cnf_size)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
cnf_base_addr = data & E1000_EXTCNF_CTRL_EXT_CNF_POINTER_MASK;
|
||||||
|
cnf_base_addr >>= E1000_EXTCNF_CTRL_EXT_CNF_POINTER_SHIFT;
|
||||||
|
|
||||||
|
if (!(data & E1000_EXTCNF_CTRL_OEM_WRITE_ENABLE) &&
|
||||||
|
(hw->mac.type == e1000_pchlan)) {
|
||||||
|
/*
|
||||||
|
* HW configures the SMBus address and LEDs when the
|
||||||
|
* OEM and LCD Write Enable bits are set in the NVM.
|
||||||
|
* When both NVM bits are cleared, SW will configure
|
||||||
|
* them instead.
|
||||||
|
*/
|
||||||
|
data = er32(STRAP);
|
||||||
|
data &= E1000_STRAP_SMBUS_ADDRESS_MASK;
|
||||||
|
reg_data = data >> E1000_STRAP_SMBUS_ADDRESS_SHIFT;
|
||||||
|
reg_data |= HV_SMB_ADDR_PEC_EN | HV_SMB_ADDR_VALID;
|
||||||
|
ret_val = e1000_write_phy_reg_hv_locked(hw, HV_SMB_ADDR,
|
||||||
|
reg_data);
|
||||||
|
if (ret_val)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
data = er32(LEDCTL);
|
||||||
|
ret_val = e1000_write_phy_reg_hv_locked(hw,
|
||||||
|
HV_LED_CONFIG,
|
||||||
|
(u16)data);
|
||||||
|
if (ret_val)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
/* Configure LCD from extended configuration region. */
|
||||||
|
|
||||||
|
/* cnf_base_addr is in DWORD */
|
||||||
|
word_addr = (u16)(cnf_base_addr << 1);
|
||||||
|
|
||||||
|
for (i = 0; i < cnf_size; i++) {
|
||||||
|
ret_val = e1000_read_nvm(hw, (word_addr + i * 2), 1,
|
||||||
|
®_data);
|
||||||
|
if (ret_val)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
ret_val = e1000_read_nvm(hw, (word_addr + i * 2 + 1),
|
||||||
|
1, ®_addr);
|
||||||
|
if (ret_val)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
/* Save off the PHY page for future writes. */
|
||||||
|
if (reg_addr == IGP01E1000_PHY_PAGE_SELECT) {
|
||||||
|
phy_page = reg_data;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
reg_addr &= PHY_REG_MASK;
|
||||||
|
reg_addr |= phy_page;
|
||||||
|
|
||||||
|
ret_val = phy->ops.write_phy_reg_locked(hw,
|
||||||
|
(u32)reg_addr,
|
||||||
|
reg_data);
|
||||||
|
if (ret_val)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
hw->phy.ops.release_phy(hw);
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* e1000_k1_gig_workaround_hv - K1 Si workaround
|
||||||
|
* @hw: pointer to the HW structure
|
||||||
|
* @link: link up bool flag
|
||||||
|
*
|
||||||
|
* If K1 is enabled for 1Gbps, the MAC might stall when transitioning
|
||||||
|
* from a lower speed. This workaround disables K1 whenever link is at 1Gig
|
||||||
|
* If link is down, the function will restore the default K1 setting located
|
||||||
|
* in the NVM.
|
||||||
|
**/
|
||||||
|
static s32 e1000_k1_gig_workaround_hv(struct e1000_hw *hw, bool link)
|
||||||
|
{
|
||||||
|
s32 ret_val = 0;
|
||||||
|
u16 status_reg = 0;
|
||||||
|
bool k1_enable = hw->dev_spec.ich8lan.nvm_k1_enabled;
|
||||||
|
|
||||||
|
if (hw->mac.type != e1000_pchlan)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
/* Wrap the whole flow with the sw flag */
|
||||||
|
ret_val = hw->phy.ops.acquire_phy(hw);
|
||||||
|
if (ret_val)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
/* Disable K1 when link is 1Gbps, otherwise use the NVM setting */
|
||||||
|
if (link) {
|
||||||
|
if (hw->phy.type == e1000_phy_82578) {
|
||||||
|
ret_val = hw->phy.ops.read_phy_reg_locked(hw,
|
||||||
|
BM_CS_STATUS,
|
||||||
|
&status_reg);
|
||||||
|
if (ret_val)
|
||||||
|
goto release;
|
||||||
|
|
||||||
|
status_reg &= BM_CS_STATUS_LINK_UP |
|
||||||
|
BM_CS_STATUS_RESOLVED |
|
||||||
|
BM_CS_STATUS_SPEED_MASK;
|
||||||
|
|
||||||
|
if (status_reg == (BM_CS_STATUS_LINK_UP |
|
||||||
|
BM_CS_STATUS_RESOLVED |
|
||||||
|
BM_CS_STATUS_SPEED_1000))
|
||||||
|
k1_enable = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hw->phy.type == e1000_phy_82577) {
|
||||||
|
ret_val = hw->phy.ops.read_phy_reg_locked(hw,
|
||||||
|
HV_M_STATUS,
|
||||||
|
&status_reg);
|
||||||
|
if (ret_val)
|
||||||
|
goto release;
|
||||||
|
|
||||||
|
status_reg &= HV_M_STATUS_LINK_UP |
|
||||||
|
HV_M_STATUS_AUTONEG_COMPLETE |
|
||||||
|
HV_M_STATUS_SPEED_MASK;
|
||||||
|
|
||||||
|
if (status_reg == (HV_M_STATUS_LINK_UP |
|
||||||
|
HV_M_STATUS_AUTONEG_COMPLETE |
|
||||||
|
HV_M_STATUS_SPEED_1000))
|
||||||
|
k1_enable = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Link stall fix for link up */
|
||||||
|
ret_val = hw->phy.ops.write_phy_reg_locked(hw, PHY_REG(770, 19),
|
||||||
|
0x0100);
|
||||||
|
if (ret_val)
|
||||||
|
goto release;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
/* Link stall fix for link down */
|
||||||
|
ret_val = hw->phy.ops.write_phy_reg_locked(hw, PHY_REG(770, 19),
|
||||||
|
0x4100);
|
||||||
|
if (ret_val)
|
||||||
|
goto release;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret_val = e1000_configure_k1_ich8lan(hw, k1_enable);
|
||||||
|
|
||||||
|
release:
|
||||||
|
hw->phy.ops.release_phy(hw);
|
||||||
|
out:
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* e1000_configure_k1_ich8lan - Configure K1 power state
|
||||||
|
* @hw: pointer to the HW structure
|
||||||
|
* @enable: K1 state to configure
|
||||||
|
*
|
||||||
|
* Configure the K1 power state based on the provided parameter.
|
||||||
|
* Assumes semaphore already acquired.
|
||||||
|
*
|
||||||
|
* Success returns 0, Failure returns -E1000_ERR_PHY (-2)
|
||||||
|
**/
|
||||||
|
static s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable)
|
||||||
|
{
|
||||||
|
s32 ret_val = 0;
|
||||||
|
u32 ctrl_reg = 0;
|
||||||
|
u32 ctrl_ext = 0;
|
||||||
|
u32 reg = 0;
|
||||||
|
u16 kmrn_reg = 0;
|
||||||
|
|
||||||
|
ret_val = e1000e_read_kmrn_reg_locked(hw,
|
||||||
|
E1000_KMRNCTRLSTA_K1_CONFIG,
|
||||||
|
&kmrn_reg);
|
||||||
|
if (ret_val)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
if (k1_enable)
|
||||||
|
kmrn_reg |= E1000_KMRNCTRLSTA_K1_ENABLE;
|
||||||
|
else
|
||||||
|
kmrn_reg &= ~E1000_KMRNCTRLSTA_K1_ENABLE;
|
||||||
|
|
||||||
|
ret_val = e1000e_write_kmrn_reg_locked(hw,
|
||||||
|
E1000_KMRNCTRLSTA_K1_CONFIG,
|
||||||
|
kmrn_reg);
|
||||||
|
if (ret_val)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
udelay(20);
|
||||||
|
ctrl_ext = er32(CTRL_EXT);
|
||||||
|
ctrl_reg = er32(CTRL);
|
||||||
|
|
||||||
|
reg = ctrl_reg & ~(E1000_CTRL_SPD_1000 | E1000_CTRL_SPD_100);
|
||||||
|
reg |= E1000_CTRL_FRCSPD;
|
||||||
|
ew32(CTRL, reg);
|
||||||
|
|
||||||
|
ew32(CTRL_EXT, ctrl_ext | E1000_CTRL_EXT_SPD_BYPS);
|
||||||
|
udelay(20);
|
||||||
|
ew32(CTRL, ctrl_reg);
|
||||||
|
ew32(CTRL_EXT, ctrl_ext);
|
||||||
|
udelay(20);
|
||||||
|
|
||||||
|
out:
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* e1000_oem_bits_config_ich8lan - SW-based LCD Configuration
|
||||||
|
* @hw: pointer to the HW structure
|
||||||
|
* @d0_state: boolean if entering d0 or d3 device state
|
||||||
|
*
|
||||||
|
* SW will configure Gbe Disable and LPLU based on the NVM. The four bits are
|
||||||
|
* collectively called OEM bits. The OEM Write Enable bit and SW Config bit
|
||||||
|
* in NVM determines whether HW should configure LPLU and Gbe Disable.
|
||||||
|
**/
|
||||||
|
static s32 e1000_oem_bits_config_ich8lan(struct e1000_hw *hw, bool d0_state)
|
||||||
|
{
|
||||||
|
s32 ret_val = 0;
|
||||||
|
u32 mac_reg;
|
||||||
|
u16 oem_reg;
|
||||||
|
|
||||||
|
if (hw->mac.type != e1000_pchlan)
|
||||||
|
return ret_val;
|
||||||
|
|
||||||
|
ret_val = hw->phy.ops.acquire_phy(hw);
|
||||||
|
if (ret_val)
|
||||||
|
return ret_val;
|
||||||
|
|
||||||
|
mac_reg = er32(EXTCNF_CTRL);
|
||||||
|
if (mac_reg & E1000_EXTCNF_CTRL_OEM_WRITE_ENABLE)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
mac_reg = er32(FEXTNVM);
|
||||||
|
if (!(mac_reg & E1000_FEXTNVM_SW_CONFIG_ICH8M))
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
mac_reg = er32(PHY_CTRL);
|
||||||
|
|
||||||
|
ret_val = hw->phy.ops.read_phy_reg_locked(hw, HV_OEM_BITS, &oem_reg);
|
||||||
|
if (ret_val)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
oem_reg &= ~(HV_OEM_BITS_GBE_DIS | HV_OEM_BITS_LPLU);
|
||||||
|
|
||||||
|
if (d0_state) {
|
||||||
|
if (mac_reg & E1000_PHY_CTRL_GBE_DISABLE)
|
||||||
|
oem_reg |= HV_OEM_BITS_GBE_DIS;
|
||||||
|
|
||||||
|
if (mac_reg & E1000_PHY_CTRL_D0A_LPLU)
|
||||||
|
oem_reg |= HV_OEM_BITS_LPLU;
|
||||||
|
} else {
|
||||||
|
if (mac_reg & E1000_PHY_CTRL_NOND0A_GBE_DISABLE)
|
||||||
|
oem_reg |= HV_OEM_BITS_GBE_DIS;
|
||||||
|
|
||||||
|
if (mac_reg & E1000_PHY_CTRL_NOND0A_LPLU)
|
||||||
|
oem_reg |= HV_OEM_BITS_LPLU;
|
||||||
|
}
|
||||||
|
/* Restart auto-neg to activate the bits */
|
||||||
|
oem_reg |= HV_OEM_BITS_RESTART_AN;
|
||||||
|
ret_val = hw->phy.ops.write_phy_reg_locked(hw, HV_OEM_BITS, oem_reg);
|
||||||
|
|
||||||
|
out:
|
||||||
|
hw->phy.ops.release_phy(hw);
|
||||||
|
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* e1000_hv_phy_workarounds_ich8lan - A series of Phy workarounds to be
|
* e1000_hv_phy_workarounds_ich8lan - A series of Phy workarounds to be
|
||||||
* done after every PHY reset.
|
* done after every PHY reset.
|
||||||
|
@ -833,10 +1168,20 @@ static s32 e1000_hv_phy_workarounds_ich8lan(struct e1000_hw *hw)
|
||||||
ret_val = hw->phy.ops.acquire_phy(hw);
|
ret_val = hw->phy.ops.acquire_phy(hw);
|
||||||
if (ret_val)
|
if (ret_val)
|
||||||
return ret_val;
|
return ret_val;
|
||||||
|
|
||||||
hw->phy.addr = 1;
|
hw->phy.addr = 1;
|
||||||
e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, 0);
|
ret_val = e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, 0);
|
||||||
|
if (ret_val)
|
||||||
|
goto out;
|
||||||
hw->phy.ops.release_phy(hw);
|
hw->phy.ops.release_phy(hw);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Configure the K1 Si workaround during phy reset assuming there is
|
||||||
|
* link so that it disables K1 if link is in 1Gbps.
|
||||||
|
*/
|
||||||
|
ret_val = e1000_k1_gig_workaround_hv(hw, true);
|
||||||
|
|
||||||
|
out:
|
||||||
return ret_val;
|
return ret_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -882,11 +1227,8 @@ static void e1000_lan_init_done_ich8lan(struct e1000_hw *hw)
|
||||||
**/
|
**/
|
||||||
static s32 e1000_phy_hw_reset_ich8lan(struct e1000_hw *hw)
|
static s32 e1000_phy_hw_reset_ich8lan(struct e1000_hw *hw)
|
||||||
{
|
{
|
||||||
struct e1000_phy_info *phy = &hw->phy;
|
s32 ret_val = 0;
|
||||||
u32 i;
|
u16 reg;
|
||||||
u32 data, cnf_size, cnf_base_addr, sw_cfg_mask;
|
|
||||||
s32 ret_val;
|
|
||||||
u16 reg, word_addr, reg_data, reg_addr, phy_page = 0;
|
|
||||||
|
|
||||||
ret_val = e1000e_phy_hw_reset_generic(hw);
|
ret_val = e1000e_phy_hw_reset_generic(hw);
|
||||||
if (ret_val)
|
if (ret_val)
|
||||||
|
@ -905,81 +1247,16 @@ static s32 e1000_phy_hw_reset_ich8lan(struct e1000_hw *hw)
|
||||||
if (hw->mac.type == e1000_pchlan)
|
if (hw->mac.type == e1000_pchlan)
|
||||||
e1e_rphy(hw, BM_WUC, ®);
|
e1e_rphy(hw, BM_WUC, ®);
|
||||||
|
|
||||||
/*
|
/* Configure the LCD with the extended configuration region in NVM */
|
||||||
* Initialize the PHY from the NVM on ICH platforms. This
|
ret_val = e1000_sw_lcd_config_ich8lan(hw);
|
||||||
* is needed due to an issue where the NVM configuration is
|
|
||||||
* not properly autoloaded after power transitions.
|
|
||||||
* Therefore, after each PHY reset, we will load the
|
|
||||||
* configuration data out of the NVM manually.
|
|
||||||
*/
|
|
||||||
if (hw->mac.type == e1000_ich8lan && phy->type == e1000_phy_igp_3) {
|
|
||||||
struct e1000_adapter *adapter = hw->adapter;
|
|
||||||
|
|
||||||
/* Check if SW needs configure the PHY */
|
|
||||||
if ((adapter->pdev->device == E1000_DEV_ID_ICH8_IGP_M_AMT) ||
|
|
||||||
(adapter->pdev->device == E1000_DEV_ID_ICH8_IGP_M))
|
|
||||||
sw_cfg_mask = E1000_FEXTNVM_SW_CONFIG_ICH8M;
|
|
||||||
else
|
|
||||||
sw_cfg_mask = E1000_FEXTNVM_SW_CONFIG;
|
|
||||||
|
|
||||||
data = er32(FEXTNVM);
|
|
||||||
if (!(data & sw_cfg_mask))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* Wait for basic configuration completes before proceeding */
|
|
||||||
e1000_lan_init_done_ich8lan(hw);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Make sure HW does not configure LCD from PHY
|
|
||||||
* extended configuration before SW configuration
|
|
||||||
*/
|
|
||||||
data = er32(EXTCNF_CTRL);
|
|
||||||
if (data & E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
cnf_size = er32(EXTCNF_SIZE);
|
|
||||||
cnf_size &= E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_MASK;
|
|
||||||
cnf_size >>= E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_SHIFT;
|
|
||||||
if (!cnf_size)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
cnf_base_addr = data & E1000_EXTCNF_CTRL_EXT_CNF_POINTER_MASK;
|
|
||||||
cnf_base_addr >>= E1000_EXTCNF_CTRL_EXT_CNF_POINTER_SHIFT;
|
|
||||||
|
|
||||||
/* Configure LCD from extended configuration region. */
|
|
||||||
|
|
||||||
/* cnf_base_addr is in DWORD */
|
|
||||||
word_addr = (u16)(cnf_base_addr << 1);
|
|
||||||
|
|
||||||
for (i = 0; i < cnf_size; i++) {
|
|
||||||
ret_val = e1000_read_nvm(hw,
|
|
||||||
(word_addr + i * 2),
|
|
||||||
1,
|
|
||||||
®_data);
|
|
||||||
if (ret_val)
|
if (ret_val)
|
||||||
return ret_val;
|
goto out;
|
||||||
|
|
||||||
ret_val = e1000_read_nvm(hw,
|
/* Configure the LCD with the OEM bits in NVM */
|
||||||
(word_addr + i * 2 + 1),
|
if (hw->mac.type == e1000_pchlan)
|
||||||
1,
|
ret_val = e1000_oem_bits_config_ich8lan(hw, true);
|
||||||
®_addr);
|
|
||||||
if (ret_val)
|
|
||||||
return ret_val;
|
|
||||||
|
|
||||||
/* Save off the PHY page for future writes. */
|
|
||||||
if (reg_addr == IGP01E1000_PHY_PAGE_SELECT) {
|
|
||||||
phy_page = reg_data;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
reg_addr |= phy_page;
|
|
||||||
|
|
||||||
ret_val = e1e_wphy(hw, (u32)reg_addr, reg_data);
|
|
||||||
if (ret_val)
|
|
||||||
return ret_val;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
out:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2306,6 +2583,7 @@ static s32 e1000_get_bus_info_ich8lan(struct e1000_hw *hw)
|
||||||
**/
|
**/
|
||||||
static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
|
static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
|
||||||
{
|
{
|
||||||
|
struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan;
|
||||||
u16 reg;
|
u16 reg;
|
||||||
u32 ctrl, icr, kab;
|
u32 ctrl, icr, kab;
|
||||||
s32 ret_val;
|
s32 ret_val;
|
||||||
|
@ -2341,6 +2619,18 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
|
||||||
ew32(PBS, E1000_PBS_16K);
|
ew32(PBS, E1000_PBS_16K);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (hw->mac.type == e1000_pchlan) {
|
||||||
|
/* Save the NVM K1 bit setting*/
|
||||||
|
ret_val = e1000_read_nvm(hw, E1000_NVM_K1_CONFIG, 1, ®);
|
||||||
|
if (ret_val)
|
||||||
|
return ret_val;
|
||||||
|
|
||||||
|
if (reg & E1000_NVM_K1_ENABLE)
|
||||||
|
dev_spec->nvm_k1_enabled = true;
|
||||||
|
else
|
||||||
|
dev_spec->nvm_k1_enabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
ctrl = er32(CTRL);
|
ctrl = er32(CTRL);
|
||||||
|
|
||||||
if (!e1000_check_reset_block(hw)) {
|
if (!e1000_check_reset_block(hw)) {
|
||||||
|
@ -2386,6 +2676,15 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
|
||||||
if (hw->mac.type == e1000_pchlan)
|
if (hw->mac.type == e1000_pchlan)
|
||||||
e1e_rphy(hw, BM_WUC, ®);
|
e1e_rphy(hw, BM_WUC, ®);
|
||||||
|
|
||||||
|
ret_val = e1000_sw_lcd_config_ich8lan(hw);
|
||||||
|
if (ret_val)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
if (hw->mac.type == e1000_pchlan) {
|
||||||
|
ret_val = e1000_oem_bits_config_ich8lan(hw, true);
|
||||||
|
if (ret_val)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* For PCH, this write will make sure that any noise
|
* For PCH, this write will make sure that any noise
|
||||||
* will be detected as a CRC error and be dropped rather than show up
|
* will be detected as a CRC error and be dropped rather than show up
|
||||||
|
@ -2404,6 +2703,7 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
|
||||||
if (hw->mac.type == e1000_pchlan)
|
if (hw->mac.type == e1000_pchlan)
|
||||||
ret_val = e1000_hv_phy_workarounds_ich8lan(hw);
|
ret_val = e1000_hv_phy_workarounds_ich8lan(hw);
|
||||||
|
|
||||||
|
out:
|
||||||
return ret_val;
|
return ret_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2708,14 +3008,6 @@ static s32 e1000_get_link_up_info_ich8lan(struct e1000_hw *hw, u16 *speed,
|
||||||
if (ret_val)
|
if (ret_val)
|
||||||
return ret_val;
|
return ret_val;
|
||||||
|
|
||||||
if ((hw->mac.type == e1000_pchlan) && (*speed == SPEED_1000)) {
|
|
||||||
ret_val = e1000e_write_kmrn_reg(hw,
|
|
||||||
E1000_KMRNCTRLSTA_K1_CONFIG,
|
|
||||||
E1000_KMRNCTRLSTA_K1_DISABLE);
|
|
||||||
if (ret_val)
|
|
||||||
return ret_val;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((hw->mac.type == e1000_ich8lan) &&
|
if ((hw->mac.type == e1000_ich8lan) &&
|
||||||
(hw->phy.type == e1000_phy_igp_3) &&
|
(hw->phy.type == e1000_phy_igp_3) &&
|
||||||
(*speed == SPEED_1000)) {
|
(*speed == SPEED_1000)) {
|
||||||
|
|
|
@ -95,13 +95,6 @@ static const u16 e1000_igp_2_cable_length_table[] =
|
||||||
/* BM PHY Copper Specific Control 1 */
|
/* BM PHY Copper Specific Control 1 */
|
||||||
#define BM_CS_CTRL1 16
|
#define BM_CS_CTRL1 16
|
||||||
|
|
||||||
/* BM PHY Copper Specific Status */
|
|
||||||
#define BM_CS_STATUS 17
|
|
||||||
#define BM_CS_STATUS_LINK_UP 0x0400
|
|
||||||
#define BM_CS_STATUS_RESOLVED 0x0800
|
|
||||||
#define BM_CS_STATUS_SPEED_MASK 0xC000
|
|
||||||
#define BM_CS_STATUS_SPEED_1000 0x8000
|
|
||||||
|
|
||||||
#define HV_MUX_DATA_CTRL PHY_REG(776, 16)
|
#define HV_MUX_DATA_CTRL PHY_REG(776, 16)
|
||||||
#define HV_MUX_DATA_CTRL_GEN_TO_MAC 0x0400
|
#define HV_MUX_DATA_CTRL_GEN_TO_MAC 0x0400
|
||||||
#define HV_MUX_DATA_CTRL_FORCE_SPEED 0x0004
|
#define HV_MUX_DATA_CTRL_FORCE_SPEED 0x0004
|
||||||
|
@ -563,7 +556,7 @@ s32 e1000e_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* e1000_read_kmrn_reg_locked - Read kumeran register
|
* e1000e_read_kmrn_reg_locked - Read kumeran register
|
||||||
* @hw: pointer to the HW structure
|
* @hw: pointer to the HW structure
|
||||||
* @offset: register offset to be read
|
* @offset: register offset to be read
|
||||||
* @data: pointer to the read data
|
* @data: pointer to the read data
|
||||||
|
@ -572,7 +565,7 @@ s32 e1000e_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data)
|
||||||
* information retrieved is stored in data.
|
* information retrieved is stored in data.
|
||||||
* Assumes semaphore already acquired.
|
* Assumes semaphore already acquired.
|
||||||
**/
|
**/
|
||||||
s32 e1000_read_kmrn_reg_locked(struct e1000_hw *hw, u32 offset, u16 *data)
|
s32 e1000e_read_kmrn_reg_locked(struct e1000_hw *hw, u32 offset, u16 *data)
|
||||||
{
|
{
|
||||||
return __e1000_read_kmrn_reg(hw, offset, data, true);
|
return __e1000_read_kmrn_reg(hw, offset, data, true);
|
||||||
}
|
}
|
||||||
|
@ -631,7 +624,7 @@ s32 e1000e_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* e1000_write_kmrn_reg_locked - Write kumeran register
|
* e1000e_write_kmrn_reg_locked - Write kumeran register
|
||||||
* @hw: pointer to the HW structure
|
* @hw: pointer to the HW structure
|
||||||
* @offset: register offset to write to
|
* @offset: register offset to write to
|
||||||
* @data: data to write at register offset
|
* @data: data to write at register offset
|
||||||
|
@ -639,7 +632,7 @@ s32 e1000e_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data)
|
||||||
* Write the data to PHY register at the offset using the kumeran interface.
|
* Write the data to PHY register at the offset using the kumeran interface.
|
||||||
* Assumes semaphore already acquired.
|
* Assumes semaphore already acquired.
|
||||||
**/
|
**/
|
||||||
s32 e1000_write_kmrn_reg_locked(struct e1000_hw *hw, u32 offset, u16 data)
|
s32 e1000e_write_kmrn_reg_locked(struct e1000_hw *hw, u32 offset, u16 data)
|
||||||
{
|
{
|
||||||
return __e1000_write_kmrn_reg(hw, offset, data, true);
|
return __e1000_write_kmrn_reg(hw, offset, data, true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1760,7 +1760,7 @@ static struct pcmcia_device_id pcnet_ids[] = {
|
||||||
PCMCIA_DEVICE_CIS_MANF_CARD(0xc00f, 0x0002, "cis/LA-PCM.cis"),
|
PCMCIA_DEVICE_CIS_MANF_CARD(0xc00f, 0x0002, "cis/LA-PCM.cis"),
|
||||||
PCMCIA_DEVICE_CIS_PROD_ID12("KTI", "PE520 PLUS", 0xad180345, 0x9d58d392, "PE520.cis"),
|
PCMCIA_DEVICE_CIS_PROD_ID12("KTI", "PE520 PLUS", 0xad180345, 0x9d58d392, "PE520.cis"),
|
||||||
PCMCIA_DEVICE_CIS_PROD_ID12("NDC", "Ethernet", 0x01c43ae1, 0x00b2e941, "cis/NE2K.cis"),
|
PCMCIA_DEVICE_CIS_PROD_ID12("NDC", "Ethernet", 0x01c43ae1, 0x00b2e941, "cis/NE2K.cis"),
|
||||||
PCMCIA_DEVICE_CIS_PROD_ID12("PMX ", "PE-200", 0x34f3f1c8, 0x10b59f8c, "PE-200.cis"),
|
PCMCIA_DEVICE_CIS_PROD_ID12("PMX ", "PE-200", 0x34f3f1c8, 0x10b59f8c, "cis/PE-200.cis"),
|
||||||
PCMCIA_DEVICE_CIS_PROD_ID12("TAMARACK", "Ethernet", 0xcf434fba, 0x00b2e941, "cis/tamarack.cis"),
|
PCMCIA_DEVICE_CIS_PROD_ID12("TAMARACK", "Ethernet", 0xcf434fba, 0x00b2e941, "cis/tamarack.cis"),
|
||||||
PCMCIA_DEVICE_PROD_ID12("Ethernet", "CF Size PC Card", 0x00b2e941, 0x43ac239b),
|
PCMCIA_DEVICE_PROD_ID12("Ethernet", "CF Size PC Card", 0x00b2e941, 0x43ac239b),
|
||||||
PCMCIA_DEVICE_PROD_ID123("Fast Ethernet", "CF Size PC Card", "1.0",
|
PCMCIA_DEVICE_PROD_ID123("Fast Ethernet", "CF Size PC Card", "1.0",
|
||||||
|
|
|
@ -3379,7 +3379,7 @@ static u16 rtl_rw_cpluscmd(void __iomem *ioaddr)
|
||||||
static void rtl_set_rx_max_size(void __iomem *ioaddr, unsigned int rx_buf_sz)
|
static void rtl_set_rx_max_size(void __iomem *ioaddr, unsigned int rx_buf_sz)
|
||||||
{
|
{
|
||||||
/* Low hurts. Let's disable the filtering. */
|
/* Low hurts. Let's disable the filtering. */
|
||||||
RTL_W16(RxMaxSize, rx_buf_sz);
|
RTL_W16(RxMaxSize, rx_buf_sz + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rtl8169_set_magic_reg(void __iomem *ioaddr, unsigned mac_version)
|
static void rtl8169_set_magic_reg(void __iomem *ioaddr, unsigned mac_version)
|
||||||
|
|
|
@ -4651,6 +4651,8 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
|
||||||
goto err_out_free_netdev;
|
goto err_out_free_netdev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
netif_carrier_off(dev);
|
||||||
|
|
||||||
netif_napi_add(dev, &hw->napi, sky2_poll, NAPI_WEIGHT);
|
netif_napi_add(dev, &hw->napi, sky2_poll, NAPI_WEIGHT);
|
||||||
|
|
||||||
err = request_irq(pdev->irq, sky2_intr,
|
err = request_irq(pdev->irq, sky2_intr,
|
||||||
|
|
|
@ -1143,9 +1143,16 @@ static void dir_open_adapter (struct net_device *dev)
|
||||||
} else {
|
} else {
|
||||||
char **prphase = printphase;
|
char **prphase = printphase;
|
||||||
char **prerror = printerror;
|
char **prerror = printerror;
|
||||||
|
int pnr = err / 16 - 1;
|
||||||
|
int enr = err % 16 - 1;
|
||||||
DPRINTK("TR Adapter misc open failure, error code = ");
|
DPRINTK("TR Adapter misc open failure, error code = ");
|
||||||
printk("0x%x, Phase: %s, Error: %s\n",
|
if (pnr < 0 || pnr >= ARRAY_SIZE(printphase) ||
|
||||||
err, prphase[err/16 -1], prerror[err%16 -1]);
|
enr < 0 ||
|
||||||
|
enr >= ARRAY_SIZE(printerror))
|
||||||
|
printk("0x%x, invalid Phase/Error.", err);
|
||||||
|
else
|
||||||
|
printk("0x%x, Phase: %s, Error: %s\n", err,
|
||||||
|
prphase[pnr], prerror[enr]);
|
||||||
printk(" retrying after %ds delay...\n",
|
printk(" retrying after %ds delay...\n",
|
||||||
TR_RETRY_INTERVAL/HZ);
|
TR_RETRY_INTERVAL/HZ);
|
||||||
}
|
}
|
||||||
|
|
|
@ -174,7 +174,7 @@ config USB_NET_CDCETHER
|
||||||
* Ericsson Mobile Broadband Module (all variants)
|
* Ericsson Mobile Broadband Module (all variants)
|
||||||
* Motorola (DM100 and SB4100)
|
* Motorola (DM100 and SB4100)
|
||||||
* Broadcom Cable Modem (reference design)
|
* Broadcom Cable Modem (reference design)
|
||||||
* Toshiba (PCX1100U and F3507g)
|
* Toshiba (PCX1100U and F3507g/F3607gw)
|
||||||
* ...
|
* ...
|
||||||
|
|
||||||
This driver creates an interface named "ethX", where X depends on
|
This driver creates an interface named "ethX", where X depends on
|
||||||
|
|
|
@ -552,20 +552,60 @@ static const struct usb_device_id products [] = {
|
||||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
||||||
.driver_info = (unsigned long) &mbm_info,
|
.driver_info = (unsigned long) &mbm_info,
|
||||||
}, {
|
}, {
|
||||||
/* Ericsson F3307 */
|
/* Ericsson F3607gw ver 2 */
|
||||||
|
USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1905, USB_CLASS_COMM,
|
||||||
|
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
||||||
|
.driver_info = (unsigned long) &mbm_info,
|
||||||
|
}, {
|
||||||
|
/* Ericsson F3607gw ver 3 */
|
||||||
USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1906, USB_CLASS_COMM,
|
USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1906, USB_CLASS_COMM,
|
||||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
||||||
.driver_info = (unsigned long) &mbm_info,
|
.driver_info = (unsigned long) &mbm_info,
|
||||||
|
}, {
|
||||||
|
/* Ericsson F3307 */
|
||||||
|
USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x190a, USB_CLASS_COMM,
|
||||||
|
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
||||||
|
.driver_info = (unsigned long) &mbm_info,
|
||||||
|
}, {
|
||||||
|
/* Ericsson F3307 ver 2 */
|
||||||
|
USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1909, USB_CLASS_COMM,
|
||||||
|
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
||||||
|
.driver_info = (unsigned long) &mbm_info,
|
||||||
|
}, {
|
||||||
|
/* Ericsson C3607w */
|
||||||
|
USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1049, USB_CLASS_COMM,
|
||||||
|
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
||||||
|
.driver_info = (unsigned long) &mbm_info,
|
||||||
}, {
|
}, {
|
||||||
/* Toshiba F3507g */
|
/* Toshiba F3507g */
|
||||||
USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x130b, USB_CLASS_COMM,
|
USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x130b, USB_CLASS_COMM,
|
||||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
||||||
.driver_info = (unsigned long) &mbm_info,
|
.driver_info = (unsigned long) &mbm_info,
|
||||||
|
}, {
|
||||||
|
/* Toshiba F3607gw */
|
||||||
|
USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x130c, USB_CLASS_COMM,
|
||||||
|
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
||||||
|
.driver_info = (unsigned long) &mbm_info,
|
||||||
|
}, {
|
||||||
|
/* Toshiba F3607gw ver 2 */
|
||||||
|
USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x1311, USB_CLASS_COMM,
|
||||||
|
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
||||||
|
.driver_info = (unsigned long) &mbm_info,
|
||||||
}, {
|
}, {
|
||||||
/* Dell F3507g */
|
/* Dell F3507g */
|
||||||
USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x8147, USB_CLASS_COMM,
|
USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x8147, USB_CLASS_COMM,
|
||||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
||||||
.driver_info = (unsigned long) &mbm_info,
|
.driver_info = (unsigned long) &mbm_info,
|
||||||
|
}, {
|
||||||
|
/* Dell F3607gw */
|
||||||
|
USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x8183, USB_CLASS_COMM,
|
||||||
|
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
||||||
|
.driver_info = (unsigned long) &mbm_info,
|
||||||
|
}, {
|
||||||
|
/* Dell F3607gw ver 2 */
|
||||||
|
USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x8184, USB_CLASS_COMM,
|
||||||
|
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
||||||
|
.driver_info = (unsigned long) &mbm_info,
|
||||||
},
|
},
|
||||||
{ }, // END
|
{ }, // END
|
||||||
};
|
};
|
||||||
|
|
|
@ -996,7 +996,7 @@ static unsigned int features[] = {
|
||||||
VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN,
|
VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct virtio_driver virtio_net = {
|
static struct virtio_driver virtio_net_driver = {
|
||||||
.feature_table = features,
|
.feature_table = features,
|
||||||
.feature_table_size = ARRAY_SIZE(features),
|
.feature_table_size = ARRAY_SIZE(features),
|
||||||
.driver.name = KBUILD_MODNAME,
|
.driver.name = KBUILD_MODNAME,
|
||||||
|
@ -1009,12 +1009,12 @@ static struct virtio_driver virtio_net = {
|
||||||
|
|
||||||
static int __init init(void)
|
static int __init init(void)
|
||||||
{
|
{
|
||||||
return register_virtio_driver(&virtio_net);
|
return register_virtio_driver(&virtio_net_driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __exit fini(void)
|
static void __exit fini(void)
|
||||||
{
|
{
|
||||||
unregister_virtio_driver(&virtio_net);
|
unregister_virtio_driver(&virtio_net_driver);
|
||||||
}
|
}
|
||||||
module_init(init);
|
module_init(init);
|
||||||
module_exit(fini);
|
module_exit(fini);
|
||||||
|
|
|
@ -679,7 +679,7 @@ static u8 ath_rc_get_highest_rix(struct ath_softc *sc,
|
||||||
return rate;
|
return rate;
|
||||||
|
|
||||||
if (rate_table->info[rate].valid_single_stream &&
|
if (rate_table->info[rate].valid_single_stream &&
|
||||||
!(ath_rc_priv->ht_cap & WLAN_RC_DS_FLAG));
|
!(ath_rc_priv->ht_cap & WLAN_RC_DS_FLAG))
|
||||||
return rate;
|
return rate;
|
||||||
|
|
||||||
/* This should not happen */
|
/* This should not happen */
|
||||||
|
|
|
@ -1157,8 +1157,9 @@ struct b43_dmaring *parse_cookie(struct b43_wldev *dev, u16 cookie, int *slot)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dma_tx_fragment(struct b43_dmaring *ring,
|
static int dma_tx_fragment(struct b43_dmaring *ring,
|
||||||
struct sk_buff *skb)
|
struct sk_buff **in_skb)
|
||||||
{
|
{
|
||||||
|
struct sk_buff *skb = *in_skb;
|
||||||
const struct b43_dma_ops *ops = ring->ops;
|
const struct b43_dma_ops *ops = ring->ops;
|
||||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||||
u8 *header;
|
u8 *header;
|
||||||
|
@ -1224,8 +1225,14 @@ static int dma_tx_fragment(struct b43_dmaring *ring,
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(skb_put(bounce_skb, skb->len), skb->data, skb->len);
|
memcpy(skb_put(bounce_skb, skb->len), skb->data, skb->len);
|
||||||
|
memcpy(bounce_skb->cb, skb->cb, sizeof(skb->cb));
|
||||||
|
bounce_skb->dev = skb->dev;
|
||||||
|
skb_set_queue_mapping(bounce_skb, skb_get_queue_mapping(skb));
|
||||||
|
info = IEEE80211_SKB_CB(bounce_skb);
|
||||||
|
|
||||||
dev_kfree_skb_any(skb);
|
dev_kfree_skb_any(skb);
|
||||||
skb = bounce_skb;
|
skb = bounce_skb;
|
||||||
|
*in_skb = bounce_skb;
|
||||||
meta->skb = skb;
|
meta->skb = skb;
|
||||||
meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1);
|
meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1);
|
||||||
if (b43_dma_mapping_error(ring, meta->dmaaddr, skb->len, 1)) {
|
if (b43_dma_mapping_error(ring, meta->dmaaddr, skb->len, 1)) {
|
||||||
|
@ -1355,7 +1362,11 @@ int b43_dma_tx(struct b43_wldev *dev, struct sk_buff *skb)
|
||||||
* static, so we don't need to store it per frame. */
|
* static, so we don't need to store it per frame. */
|
||||||
ring->queue_prio = skb_get_queue_mapping(skb);
|
ring->queue_prio = skb_get_queue_mapping(skb);
|
||||||
|
|
||||||
err = dma_tx_fragment(ring, skb);
|
/* dma_tx_fragment might reallocate the skb, so invalidate pointers pointing
|
||||||
|
* into the skb data or cb now. */
|
||||||
|
hdr = NULL;
|
||||||
|
info = NULL;
|
||||||
|
err = dma_tx_fragment(ring, &skb);
|
||||||
if (unlikely(err == -ENOKEY)) {
|
if (unlikely(err == -ENOKEY)) {
|
||||||
/* Drop this packet, as we don't have the encryption key
|
/* Drop this packet, as we don't have the encryption key
|
||||||
* anymore and must not transmit it unencrypted. */
|
* anymore and must not transmit it unencrypted. */
|
||||||
|
|
|
@ -6325,8 +6325,10 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev,
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
if (dev) {
|
if (dev) {
|
||||||
if (registered)
|
if (registered) {
|
||||||
|
unregister_ieee80211(priv->ieee);
|
||||||
unregister_netdev(dev);
|
unregister_netdev(dev);
|
||||||
|
}
|
||||||
|
|
||||||
ipw2100_hw_stop_adapter(priv);
|
ipw2100_hw_stop_adapter(priv);
|
||||||
|
|
||||||
|
@ -6383,6 +6385,7 @@ static void __devexit ipw2100_pci_remove_one(struct pci_dev *pci_dev)
|
||||||
/* Unregister the device first - this results in close()
|
/* Unregister the device first - this results in close()
|
||||||
* being called if the device is open. If we free storage
|
* being called if the device is open. If we free storage
|
||||||
* first, then close() will crash. */
|
* first, then close() will crash. */
|
||||||
|
unregister_ieee80211(priv->ieee);
|
||||||
unregister_netdev(dev);
|
unregister_netdev(dev);
|
||||||
|
|
||||||
/* ipw2100_down will ensure that there is no more pending work
|
/* ipw2100_down will ensure that there is no more pending work
|
||||||
|
|
|
@ -11822,6 +11822,7 @@ static int __devinit ipw_pci_probe(struct pci_dev *pdev,
|
||||||
if (err) {
|
if (err) {
|
||||||
IPW_ERROR("Failed to register promiscuous network "
|
IPW_ERROR("Failed to register promiscuous network "
|
||||||
"device (error %d).\n", err);
|
"device (error %d).\n", err);
|
||||||
|
unregister_ieee80211(priv->ieee);
|
||||||
unregister_netdev(priv->net_dev);
|
unregister_netdev(priv->net_dev);
|
||||||
goto out_remove_sysfs;
|
goto out_remove_sysfs;
|
||||||
}
|
}
|
||||||
|
@ -11872,6 +11873,7 @@ static void __devexit ipw_pci_remove(struct pci_dev *pdev)
|
||||||
|
|
||||||
mutex_unlock(&priv->mutex);
|
mutex_unlock(&priv->mutex);
|
||||||
|
|
||||||
|
unregister_ieee80211(priv->ieee);
|
||||||
unregister_netdev(priv->net_dev);
|
unregister_netdev(priv->net_dev);
|
||||||
|
|
||||||
if (priv->rxq) {
|
if (priv->rxq) {
|
||||||
|
|
|
@ -1020,6 +1020,7 @@ static inline int libipw_is_cck_rate(u8 rate)
|
||||||
/* ieee80211.c */
|
/* ieee80211.c */
|
||||||
extern void free_ieee80211(struct net_device *dev, int monitor);
|
extern void free_ieee80211(struct net_device *dev, int monitor);
|
||||||
extern struct net_device *alloc_ieee80211(int sizeof_priv, int monitor);
|
extern struct net_device *alloc_ieee80211(int sizeof_priv, int monitor);
|
||||||
|
extern void unregister_ieee80211(struct libipw_device *ieee);
|
||||||
extern int libipw_change_mtu(struct net_device *dev, int new_mtu);
|
extern int libipw_change_mtu(struct net_device *dev, int new_mtu);
|
||||||
|
|
||||||
extern void libipw_networks_age(struct libipw_device *ieee,
|
extern void libipw_networks_age(struct libipw_device *ieee,
|
||||||
|
|
|
@ -235,14 +235,17 @@ void free_ieee80211(struct net_device *dev, int monitor)
|
||||||
libipw_networks_free(ieee);
|
libipw_networks_free(ieee);
|
||||||
|
|
||||||
/* free cfg80211 resources */
|
/* free cfg80211 resources */
|
||||||
if (!monitor) {
|
if (!monitor)
|
||||||
|
wiphy_free(ieee->wdev.wiphy);
|
||||||
|
|
||||||
|
free_netdev(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
void unregister_ieee80211(struct libipw_device *ieee)
|
||||||
|
{
|
||||||
wiphy_unregister(ieee->wdev.wiphy);
|
wiphy_unregister(ieee->wdev.wiphy);
|
||||||
kfree(ieee->a_band.channels);
|
kfree(ieee->a_band.channels);
|
||||||
kfree(ieee->bg_band.channels);
|
kfree(ieee->bg_band.channels);
|
||||||
wiphy_free(ieee->wdev.wiphy);
|
|
||||||
}
|
|
||||||
|
|
||||||
free_netdev(dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_LIBIPW_DEBUG
|
#ifdef CONFIG_LIBIPW_DEBUG
|
||||||
|
@ -330,3 +333,4 @@ module_init(libipw_init);
|
||||||
|
|
||||||
EXPORT_SYMBOL(alloc_ieee80211);
|
EXPORT_SYMBOL(alloc_ieee80211);
|
||||||
EXPORT_SYMBOL(free_ieee80211);
|
EXPORT_SYMBOL(free_ieee80211);
|
||||||
|
EXPORT_SYMBOL(unregister_ieee80211);
|
||||||
|
|
|
@ -511,7 +511,7 @@ static int __if_usb_submit_rx_urb(struct if_usb_card *cardp,
|
||||||
/* Fill the receive configuration URB and initialise the Rx call back */
|
/* Fill the receive configuration URB and initialise the Rx call back */
|
||||||
usb_fill_bulk_urb(cardp->rx_urb, cardp->udev,
|
usb_fill_bulk_urb(cardp->rx_urb, cardp->udev,
|
||||||
usb_rcvbulkpipe(cardp->udev, cardp->ep_in),
|
usb_rcvbulkpipe(cardp->udev, cardp->ep_in),
|
||||||
(void *) (skb->tail + (size_t) IPFIELD_ALIGN_OFFSET),
|
skb->data + IPFIELD_ALIGN_OFFSET,
|
||||||
MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn,
|
MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn,
|
||||||
cardp);
|
cardp);
|
||||||
|
|
||||||
|
|
|
@ -2389,10 +2389,13 @@ static struct usb_device_id rt73usb_device_table[] = {
|
||||||
{ USB_DEVICE(0x13b1, 0x0023), USB_DEVICE_DATA(&rt73usb_ops) },
|
{ USB_DEVICE(0x13b1, 0x0023), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
{ USB_DEVICE(0x13b1, 0x0028), USB_DEVICE_DATA(&rt73usb_ops) },
|
{ USB_DEVICE(0x13b1, 0x0028), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
/* MSI */
|
/* MSI */
|
||||||
|
{ USB_DEVICE(0x0db0, 0x4600), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
{ USB_DEVICE(0x0db0, 0x6877), USB_DEVICE_DATA(&rt73usb_ops) },
|
{ USB_DEVICE(0x0db0, 0x6877), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
{ USB_DEVICE(0x0db0, 0x6874), USB_DEVICE_DATA(&rt73usb_ops) },
|
{ USB_DEVICE(0x0db0, 0x6874), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
{ USB_DEVICE(0x0db0, 0xa861), USB_DEVICE_DATA(&rt73usb_ops) },
|
{ USB_DEVICE(0x0db0, 0xa861), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
{ USB_DEVICE(0x0db0, 0xa874), USB_DEVICE_DATA(&rt73usb_ops) },
|
{ USB_DEVICE(0x0db0, 0xa874), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
|
/* Ovislink */
|
||||||
|
{ USB_DEVICE(0x1b75, 0x7318), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
/* Ralink */
|
/* Ralink */
|
||||||
{ USB_DEVICE(0x04bb, 0x093d), USB_DEVICE_DATA(&rt73usb_ops) },
|
{ USB_DEVICE(0x04bb, 0x093d), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
{ USB_DEVICE(0x148f, 0x2573), USB_DEVICE_DATA(&rt73usb_ops) },
|
{ USB_DEVICE(0x148f, 0x2573), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
|
@ -2420,6 +2423,8 @@ static struct usb_device_id rt73usb_device_table[] = {
|
||||||
/* Planex */
|
/* Planex */
|
||||||
{ USB_DEVICE(0x2019, 0xab01), USB_DEVICE_DATA(&rt73usb_ops) },
|
{ USB_DEVICE(0x2019, 0xab01), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
{ USB_DEVICE(0x2019, 0xab50), USB_DEVICE_DATA(&rt73usb_ops) },
|
{ USB_DEVICE(0x2019, 0xab50), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
|
/* WideTell */
|
||||||
|
{ USB_DEVICE(0x7167, 0x3840), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
/* Zcom */
|
/* Zcom */
|
||||||
{ USB_DEVICE(0x0cde, 0x001c), USB_DEVICE_DATA(&rt73usb_ops) },
|
{ USB_DEVICE(0x0cde, 0x001c), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
/* ZyXEL */
|
/* ZyXEL */
|
||||||
|
|
|
@ -879,10 +879,10 @@ static struct pcmcia_device_id serial_ids[] = {
|
||||||
PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0175, 0x0000, "cis/DP83903.cis"),
|
PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0175, 0x0000, "cis/DP83903.cis"),
|
||||||
PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0035, "cis/3CXEM556.cis"),
|
PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0035, "cis/3CXEM556.cis"),
|
||||||
PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x003d, "cis/3CXEM556.cis"),
|
PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x003d, "cis/3CXEM556.cis"),
|
||||||
PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC850", 0xd85f6206, 0x42a2c018, "SW_8xx_SER.cis"), /* Sierra Wireless AC850 3G Network Adapter R1 */
|
PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC850", 0xd85f6206, 0x42a2c018, "cis/SW_8xx_SER.cis"), /* Sierra Wireless AC850 3G Network Adapter R1 */
|
||||||
PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0x0710, "SW_7xx_SER.cis"), /* Sierra Wireless AC710/AC750 GPRS Network Adapter R1 */
|
PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC710/AC750", 0xd85f6206, 0x761b11e0, "cis/SW_7xx_SER.cis"), /* Sierra Wireless AC710/AC750 GPRS Network Adapter R1 */
|
||||||
PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- pre update */
|
PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0xa555, "cis/SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- pre update */
|
||||||
PCMCIA_DEVICE_CIS_MANF_CARD(0x013f, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- post update */
|
PCMCIA_DEVICE_CIS_MANF_CARD(0x013f, 0xa555, "cis/SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- post update */
|
||||||
PCMCIA_DEVICE_CIS_PROD_ID12("MultiTech", "PCMCIA 56K DataFax", 0x842047ee, 0xc2efcf03, "cis/MT5634ZLX.cis"),
|
PCMCIA_DEVICE_CIS_PROD_ID12("MultiTech", "PCMCIA 56K DataFax", 0x842047ee, 0xc2efcf03, "cis/MT5634ZLX.cis"),
|
||||||
PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-2", 0x96913a85, 0x27ab5437, "cis/COMpad2.cis"),
|
PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-2", 0x96913a85, 0x27ab5437, "cis/COMpad2.cis"),
|
||||||
PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "cis/COMpad4.cis"),
|
PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "cis/COMpad4.cis"),
|
||||||
|
|
|
@ -69,11 +69,13 @@ fw-shipped-$(CONFIG_E100) += e100/d101m_ucode.bin e100/d101s_ucode.bin \
|
||||||
fw-shipped-$(CONFIG_MYRI_SBUS) += myricom/lanai.bin
|
fw-shipped-$(CONFIG_MYRI_SBUS) += myricom/lanai.bin
|
||||||
fw-shipped-$(CONFIG_PCMCIA_PCNET) += cis/LA-PCM.cis cis/PCMLM28.cis \
|
fw-shipped-$(CONFIG_PCMCIA_PCNET) += cis/LA-PCM.cis cis/PCMLM28.cis \
|
||||||
cis/DP83903.cis cis/NE2K.cis \
|
cis/DP83903.cis cis/NE2K.cis \
|
||||||
cis/tamarack.cis
|
cis/tamarack.cis cis/PE-200.cis
|
||||||
fw-shipped-$(CONFIG_PCMCIA_3C589) += cis/3CXEM556.cis
|
fw-shipped-$(CONFIG_PCMCIA_3C589) += cis/3CXEM556.cis
|
||||||
fw-shipped-$(CONFIG_PCMCIA_3C574) += cis/3CCFEM556.cis
|
fw-shipped-$(CONFIG_PCMCIA_3C574) += cis/3CCFEM556.cis
|
||||||
fw-shipped-$(CONFIG_SERIAL_8250_CS) += cis/MT5634ZLX.cis cis/RS-COM-2P.cis \
|
fw-shipped-$(CONFIG_SERIAL_8250_CS) += cis/MT5634ZLX.cis cis/RS-COM-2P.cis \
|
||||||
cis/COMpad2.cis cis/COMpad4.cis
|
cis/COMpad2.cis cis/COMpad4.cis \
|
||||||
|
cis/SW_555_SER.cis cis/SW_7xx_SER.cis \
|
||||||
|
cis/SW_8xx_SER.cis
|
||||||
fw-shipped-$(CONFIG_PCMCIA_SMC91C92) += ositech/Xilinx7OD.bin
|
fw-shipped-$(CONFIG_PCMCIA_SMC91C92) += ositech/Xilinx7OD.bin
|
||||||
fw-shipped-$(CONFIG_SCSI_ADVANSYS) += advansys/mcode.bin advansys/38C1600.bin \
|
fw-shipped-$(CONFIG_SCSI_ADVANSYS) += advansys/mcode.bin advansys/38C1600.bin \
|
||||||
advansys/3550.bin advansys/38C0800.bin
|
advansys/3550.bin advansys/38C0800.bin
|
||||||
|
|
|
@ -600,6 +600,7 @@ File: cis/LA-PCM.cis
|
||||||
cis/DP83903.cis
|
cis/DP83903.cis
|
||||||
cis/NE2K.cis
|
cis/NE2K.cis
|
||||||
cis/tamarack.cis
|
cis/tamarack.cis
|
||||||
|
cis/PE-200.cis
|
||||||
|
|
||||||
Licence: GPL
|
Licence: GPL
|
||||||
|
|
||||||
|
@ -633,6 +634,9 @@ File: cis/MT5634ZLX.cis
|
||||||
cis/RS-COM-2P.cis
|
cis/RS-COM-2P.cis
|
||||||
cis/COMpad2.cis
|
cis/COMpad2.cis
|
||||||
cis/COMpad4.cis
|
cis/COMpad4.cis
|
||||||
|
cis/SW_555_SER.cis
|
||||||
|
cis/SW_7xx_SER.cis
|
||||||
|
cis/SW_8xx_SER.cis
|
||||||
|
|
||||||
Licence: GPL
|
Licence: GPL
|
||||||
|
|
||||||
|
|
9
firmware/cis/PE-200.cis.ihex
Normal file
9
firmware/cis/PE-200.cis.ihex
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
:1000000001030000FF151E0401504D582020200060
|
||||||
|
:1000100050452D3230300045544845524E4554002D
|
||||||
|
:1000200052303100FF210206031A050101000101CF
|
||||||
|
:100030001B0EC181190155E051000F100F30FFFF59
|
||||||
|
:040040001400FF00A9
|
||||||
|
:00000001FF
|
||||||
|
#
|
||||||
|
# Replacement CIS for PE-200 ethernet card
|
||||||
|
#
|
12
firmware/cis/SW_555_SER.cis.ihex
Normal file
12
firmware/cis/SW_555_SER.cis.ihex
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
:100000000101FF17034100FF20043F0110072102F7
|
||||||
|
:100010000200152A070053696572726120576972E0
|
||||||
|
:10002000656C657373004169724361726420353594
|
||||||
|
:1000300035004135353500526576203100FF1A050F
|
||||||
|
:1000400001030007731B0BE00118A360F8030730DE
|
||||||
|
:10005000BC3F1B08A10108A360F802071B08A2010E
|
||||||
|
:1000600008A360E803071B08A30108A360E80207D0
|
||||||
|
:0A0070001B04A40108231400FF0084
|
||||||
|
:00000001FF
|
||||||
|
#
|
||||||
|
# Replacement CIS for AC555 provided by Sierra Wireless
|
||||||
|
#
|
13
firmware/cis/SW_7xx_SER.cis.ihex
Normal file
13
firmware/cis/SW_7xx_SER.cis.ihex
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
:100000000101FF17034100FF2004920110072102A4
|
||||||
|
:1000100002001537070053696572726120576972D3
|
||||||
|
:10002000656C6573730041433731302F4143373579
|
||||||
|
:10003000300047505253204E6574776F726B2041E9
|
||||||
|
:1000400064617074657200523100FF1A050103008B
|
||||||
|
:1000500007731B10E00119784D555D25A360F80367
|
||||||
|
:100060000730BC861B08A10108A360F802071B0823
|
||||||
|
:10007000A20108A360E803071B08A30108A360E826
|
||||||
|
:0C00800002071B04A40108231400FF0069
|
||||||
|
:00000001FF
|
||||||
|
#
|
||||||
|
# Replacement CIS for AC7xx provided by Sierra Wireless
|
||||||
|
#
|
13
firmware/cis/SW_8xx_SER.cis.ihex
Normal file
13
firmware/cis/SW_8xx_SER.cis.ihex
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
:100000000101FF17034100FF2004920110072102A4
|
||||||
|
:100010000200152F070053696572726120576972DB
|
||||||
|
:10002000656C657373004143383530003347204EAB
|
||||||
|
:100030006574776F726B20416461707465720052F1
|
||||||
|
:100040003100FF1A0501030007731B10E001197846
|
||||||
|
:100050004D555D25A360F8480730BC861B08A101FB
|
||||||
|
:1000600008A360F847071B08A20108A360E8480737
|
||||||
|
:100070001B08A30108A360E847071B04A401082389
|
||||||
|
:040080001400FF0069
|
||||||
|
:00000001FF
|
||||||
|
#
|
||||||
|
# Replacement CIS for AC8xx provided by Sierra Wireless
|
||||||
|
#
|
|
@ -354,8 +354,8 @@ struct sk_buff {
|
||||||
ipvs_property:1,
|
ipvs_property:1,
|
||||||
peeked:1,
|
peeked:1,
|
||||||
nf_trace:1;
|
nf_trace:1;
|
||||||
|
__be16 protocol:16;
|
||||||
kmemcheck_bitfield_end(flags1);
|
kmemcheck_bitfield_end(flags1);
|
||||||
__be16 protocol;
|
|
||||||
|
|
||||||
void (*destructor)(struct sk_buff *skb);
|
void (*destructor)(struct sk_buff *skb);
|
||||||
#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
|
#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
|
||||||
|
@ -367,7 +367,6 @@ struct sk_buff {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int iif;
|
int iif;
|
||||||
__u16 queue_mapping;
|
|
||||||
#ifdef CONFIG_NET_SCHED
|
#ifdef CONFIG_NET_SCHED
|
||||||
__u16 tc_index; /* traffic control index */
|
__u16 tc_index; /* traffic control index */
|
||||||
#ifdef CONFIG_NET_CLS_ACT
|
#ifdef CONFIG_NET_CLS_ACT
|
||||||
|
@ -376,6 +375,7 @@ struct sk_buff {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
kmemcheck_bitfield_begin(flags2);
|
kmemcheck_bitfield_begin(flags2);
|
||||||
|
__u16 queue_mapping:16;
|
||||||
#ifdef CONFIG_IPV6_NDISC_NODETYPE
|
#ifdef CONFIG_IPV6_NDISC_NODETYPE
|
||||||
__u8 ndisc_nodetype:2;
|
__u8 ndisc_nodetype:2;
|
||||||
#endif
|
#endif
|
||||||
|
@ -1768,6 +1768,8 @@ extern int skb_copy_datagram_const_iovec(const struct sk_buff *from,
|
||||||
int to_offset,
|
int to_offset,
|
||||||
int size);
|
int size);
|
||||||
extern void skb_free_datagram(struct sock *sk, struct sk_buff *skb);
|
extern void skb_free_datagram(struct sock *sk, struct sk_buff *skb);
|
||||||
|
extern void skb_free_datagram_locked(struct sock *sk,
|
||||||
|
struct sk_buff *skb);
|
||||||
extern int skb_kill_datagram(struct sock *sk, struct sk_buff *skb,
|
extern int skb_kill_datagram(struct sock *sk, struct sk_buff *skb,
|
||||||
unsigned int flags);
|
unsigned int flags);
|
||||||
extern __wsum skb_checksum(const struct sk_buff *skb, int offset,
|
extern __wsum skb_checksum(const struct sk_buff *skb, int offset,
|
||||||
|
|
|
@ -213,7 +213,8 @@ extern struct fib_table *fib_get_table(struct net *net, u32 id);
|
||||||
extern const struct nla_policy rtm_ipv4_policy[];
|
extern const struct nla_policy rtm_ipv4_policy[];
|
||||||
extern void ip_fib_init(void);
|
extern void ip_fib_init(void);
|
||||||
extern int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif,
|
extern int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif,
|
||||||
struct net_device *dev, __be32 *spec_dst, u32 *itag);
|
struct net_device *dev, __be32 *spec_dst,
|
||||||
|
u32 *itag, u32 mark);
|
||||||
extern void fib_select_default(struct net *net, const struct flowi *flp,
|
extern void fib_select_default(struct net *net, const struct flowi *flp,
|
||||||
struct fib_result *res);
|
struct fib_result *res);
|
||||||
|
|
||||||
|
|
|
@ -255,11 +255,9 @@ static inline bool nf_ct_kill(struct nf_conn *ct)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* These are for NAT. Icky. */
|
/* These are for NAT. Icky. */
|
||||||
/* Update TCP window tracking data when NAT mangles the packet */
|
extern s16 (*nf_ct_nat_offset)(const struct nf_conn *ct,
|
||||||
extern void nf_conntrack_tcp_update(const struct sk_buff *skb,
|
enum ip_conntrack_dir dir,
|
||||||
unsigned int dataoff,
|
u32 seq);
|
||||||
struct nf_conn *ct, int dir,
|
|
||||||
s16 offset);
|
|
||||||
|
|
||||||
/* Fake conntrack entry for untracked connections */
|
/* Fake conntrack entry for untracked connections */
|
||||||
extern struct nf_conn nf_conntrack_untracked;
|
extern struct nf_conn nf_conntrack_untracked;
|
||||||
|
|
|
@ -32,4 +32,8 @@ extern int (*nf_nat_seq_adjust_hook)(struct sk_buff *skb,
|
||||||
* to port ct->master->saved_proto. */
|
* to port ct->master->saved_proto. */
|
||||||
extern void nf_nat_follow_master(struct nf_conn *ct,
|
extern void nf_nat_follow_master(struct nf_conn *ct,
|
||||||
struct nf_conntrack_expect *this);
|
struct nf_conntrack_expect *this);
|
||||||
|
|
||||||
|
extern s16 nf_nat_get_offset(const struct nf_conn *ct,
|
||||||
|
enum ip_conntrack_dir dir,
|
||||||
|
u32 seq);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -377,12 +377,16 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)
|
||||||
struct net_bridge_port *p;
|
struct net_bridge_port *p;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
if (dev->flags & IFF_LOOPBACK || dev->type != ARPHRD_ETHER)
|
/* Don't allow bridging non-ethernet like devices */
|
||||||
|
if ((dev->flags & IFF_LOOPBACK) ||
|
||||||
|
dev->type != ARPHRD_ETHER || dev->addr_len != ETH_ALEN)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
/* No bridging of bridges */
|
||||||
if (dev->netdev_ops->ndo_start_xmit == br_dev_xmit)
|
if (dev->netdev_ops->ndo_start_xmit == br_dev_xmit)
|
||||||
return -ELOOP;
|
return -ELOOP;
|
||||||
|
|
||||||
|
/* Device is already being bridged */
|
||||||
if (dev->br_port != NULL)
|
if (dev->br_port != NULL)
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
|
||||||
|
|
|
@ -224,6 +224,15 @@ void skb_free_datagram(struct sock *sk, struct sk_buff *skb)
|
||||||
consume_skb(skb);
|
consume_skb(skb);
|
||||||
sk_mem_reclaim_partial(sk);
|
sk_mem_reclaim_partial(sk);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(skb_free_datagram);
|
||||||
|
|
||||||
|
void skb_free_datagram_locked(struct sock *sk, struct sk_buff *skb)
|
||||||
|
{
|
||||||
|
lock_sock(sk);
|
||||||
|
skb_free_datagram(sk, skb);
|
||||||
|
release_sock(sk);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(skb_free_datagram_locked);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* skb_kill_datagram - Free a datagram skbuff forcibly
|
* skb_kill_datagram - Free a datagram skbuff forcibly
|
||||||
|
@ -753,5 +762,4 @@ unsigned int datagram_poll(struct file *file, struct socket *sock,
|
||||||
EXPORT_SYMBOL(datagram_poll);
|
EXPORT_SYMBOL(datagram_poll);
|
||||||
EXPORT_SYMBOL(skb_copy_and_csum_datagram_iovec);
|
EXPORT_SYMBOL(skb_copy_and_csum_datagram_iovec);
|
||||||
EXPORT_SYMBOL(skb_copy_datagram_iovec);
|
EXPORT_SYMBOL(skb_copy_datagram_iovec);
|
||||||
EXPORT_SYMBOL(skb_free_datagram);
|
|
||||||
EXPORT_SYMBOL(skb_recv_datagram);
|
EXPORT_SYMBOL(skb_recv_datagram);
|
||||||
|
|
|
@ -263,12 +263,11 @@ static int dn_def_dev_strategy(ctl_table *table,
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
rv = -ENODEV;
|
rv = -ENODEV;
|
||||||
if (dev->dn_ptr != NULL) {
|
if (dev->dn_ptr != NULL)
|
||||||
rv = dn_dev_set_default(dev, 1);
|
rv = dn_dev_set_default(dev, 1);
|
||||||
if (rv)
|
if (rv)
|
||||||
dev_put(dev);
|
dev_put(dev);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
|
@ -229,14 +229,17 @@ unsigned int inet_dev_addr_type(struct net *net, const struct net_device *dev,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif,
|
int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif,
|
||||||
struct net_device *dev, __be32 *spec_dst, u32 *itag)
|
struct net_device *dev, __be32 *spec_dst,
|
||||||
|
u32 *itag, u32 mark)
|
||||||
{
|
{
|
||||||
struct in_device *in_dev;
|
struct in_device *in_dev;
|
||||||
struct flowi fl = { .nl_u = { .ip4_u =
|
struct flowi fl = { .nl_u = { .ip4_u =
|
||||||
{ .daddr = src,
|
{ .daddr = src,
|
||||||
.saddr = dst,
|
.saddr = dst,
|
||||||
.tos = tos } },
|
.tos = tos } },
|
||||||
|
.mark = mark,
|
||||||
.iif = oif };
|
.iif = oif };
|
||||||
|
|
||||||
struct fib_result res;
|
struct fib_result res;
|
||||||
int no_addr, rpf;
|
int no_addr, rpf;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
|
@ -1476,7 +1476,7 @@ static void ipgre_tap_setup(struct net_device *dev)
|
||||||
|
|
||||||
ether_setup(dev);
|
ether_setup(dev);
|
||||||
|
|
||||||
dev->netdev_ops = &ipgre_netdev_ops;
|
dev->netdev_ops = &ipgre_tap_netdev_ops;
|
||||||
dev->destructor = free_netdev;
|
dev->destructor = free_netdev;
|
||||||
|
|
||||||
dev->iflink = 0;
|
dev->iflink = 0;
|
||||||
|
@ -1537,10 +1537,11 @@ static int ipgre_changelink(struct net_device *dev, struct nlattr *tb[],
|
||||||
if (t->dev != dev)
|
if (t->dev != dev)
|
||||||
return -EEXIST;
|
return -EEXIST;
|
||||||
} else {
|
} else {
|
||||||
unsigned nflags = 0;
|
|
||||||
|
|
||||||
t = nt;
|
t = nt;
|
||||||
|
|
||||||
|
if (dev->type != ARPHRD_ETHER) {
|
||||||
|
unsigned nflags = 0;
|
||||||
|
|
||||||
if (ipv4_is_multicast(p.iph.daddr))
|
if (ipv4_is_multicast(p.iph.daddr))
|
||||||
nflags = IFF_BROADCAST;
|
nflags = IFF_BROADCAST;
|
||||||
else if (p.iph.daddr)
|
else if (p.iph.daddr)
|
||||||
|
@ -1549,13 +1550,16 @@ static int ipgre_changelink(struct net_device *dev, struct nlattr *tb[],
|
||||||
if ((dev->flags ^ nflags) &
|
if ((dev->flags ^ nflags) &
|
||||||
(IFF_POINTOPOINT | IFF_BROADCAST))
|
(IFF_POINTOPOINT | IFF_BROADCAST))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
ipgre_tunnel_unlink(ign, t);
|
ipgre_tunnel_unlink(ign, t);
|
||||||
t->parms.iph.saddr = p.iph.saddr;
|
t->parms.iph.saddr = p.iph.saddr;
|
||||||
t->parms.iph.daddr = p.iph.daddr;
|
t->parms.iph.daddr = p.iph.daddr;
|
||||||
t->parms.i_key = p.i_key;
|
t->parms.i_key = p.i_key;
|
||||||
|
if (dev->type != ARPHRD_ETHER) {
|
||||||
memcpy(dev->dev_addr, &p.iph.saddr, 4);
|
memcpy(dev->dev_addr, &p.iph.saddr, 4);
|
||||||
memcpy(dev->broadcast, &p.iph.daddr, 4);
|
memcpy(dev->broadcast, &p.iph.daddr, 4);
|
||||||
|
}
|
||||||
ipgre_tunnel_link(ign, t);
|
ipgre_tunnel_link(ign, t);
|
||||||
netdev_state_change(dev);
|
netdev_state_change(dev);
|
||||||
}
|
}
|
||||||
|
|
|
@ -750,6 +750,8 @@ static int __init nf_nat_init(void)
|
||||||
BUG_ON(nfnetlink_parse_nat_setup_hook != NULL);
|
BUG_ON(nfnetlink_parse_nat_setup_hook != NULL);
|
||||||
rcu_assign_pointer(nfnetlink_parse_nat_setup_hook,
|
rcu_assign_pointer(nfnetlink_parse_nat_setup_hook,
|
||||||
nfnetlink_parse_nat_setup);
|
nfnetlink_parse_nat_setup);
|
||||||
|
BUG_ON(nf_ct_nat_offset != NULL);
|
||||||
|
rcu_assign_pointer(nf_ct_nat_offset, nf_nat_get_offset);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
cleanup_extend:
|
cleanup_extend:
|
||||||
|
@ -764,6 +766,7 @@ static void __exit nf_nat_cleanup(void)
|
||||||
nf_ct_extend_unregister(&nat_extend);
|
nf_ct_extend_unregister(&nat_extend);
|
||||||
rcu_assign_pointer(nf_nat_seq_adjust_hook, NULL);
|
rcu_assign_pointer(nf_nat_seq_adjust_hook, NULL);
|
||||||
rcu_assign_pointer(nfnetlink_parse_nat_setup_hook, NULL);
|
rcu_assign_pointer(nfnetlink_parse_nat_setup_hook, NULL);
|
||||||
|
rcu_assign_pointer(nf_ct_nat_offset, NULL);
|
||||||
synchronize_net();
|
synchronize_net();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -73,6 +73,28 @@ adjust_tcp_sequence(u32 seq,
|
||||||
DUMP_OFFSET(this_way);
|
DUMP_OFFSET(this_way);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Get the offset value, for conntrack */
|
||||||
|
s16 nf_nat_get_offset(const struct nf_conn *ct,
|
||||||
|
enum ip_conntrack_dir dir,
|
||||||
|
u32 seq)
|
||||||
|
{
|
||||||
|
struct nf_conn_nat *nat = nfct_nat(ct);
|
||||||
|
struct nf_nat_seq *this_way;
|
||||||
|
s16 offset;
|
||||||
|
|
||||||
|
if (!nat)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
this_way = &nat->seq[dir];
|
||||||
|
spin_lock_bh(&nf_nat_seqofs_lock);
|
||||||
|
offset = after(seq, this_way->correction_pos)
|
||||||
|
? this_way->offset_after : this_way->offset_before;
|
||||||
|
spin_unlock_bh(&nf_nat_seqofs_lock);
|
||||||
|
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(nf_nat_get_offset);
|
||||||
|
|
||||||
/* Frobs data inside this packet, which is linear. */
|
/* Frobs data inside this packet, which is linear. */
|
||||||
static void mangle_contents(struct sk_buff *skb,
|
static void mangle_contents(struct sk_buff *skb,
|
||||||
unsigned int dataoff,
|
unsigned int dataoff,
|
||||||
|
@ -189,11 +211,6 @@ nf_nat_mangle_tcp_packet(struct sk_buff *skb,
|
||||||
adjust_tcp_sequence(ntohl(tcph->seq),
|
adjust_tcp_sequence(ntohl(tcph->seq),
|
||||||
(int)rep_len - (int)match_len,
|
(int)rep_len - (int)match_len,
|
||||||
ct, ctinfo);
|
ct, ctinfo);
|
||||||
/* Tell TCP window tracking about seq change */
|
|
||||||
nf_conntrack_tcp_update(skb, ip_hdrlen(skb),
|
|
||||||
ct, CTINFO2DIR(ctinfo),
|
|
||||||
(int)rep_len - (int)match_len);
|
|
||||||
|
|
||||||
nf_conntrack_event_cache(IPCT_NATSEQADJ, ct);
|
nf_conntrack_event_cache(IPCT_NATSEQADJ, ct);
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -415,12 +432,7 @@ nf_nat_seq_adjust(struct sk_buff *skb,
|
||||||
tcph->seq = newseq;
|
tcph->seq = newseq;
|
||||||
tcph->ack_seq = newack;
|
tcph->ack_seq = newack;
|
||||||
|
|
||||||
if (!nf_nat_sack_adjust(skb, tcph, ct, ctinfo))
|
return nf_nat_sack_adjust(skb, tcph, ct, ctinfo);
|
||||||
return 0;
|
|
||||||
|
|
||||||
nf_conntrack_tcp_update(skb, ip_hdrlen(skb), ct, dir, seqoff);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Setup NAT on this expected conntrack so it follows master. */
|
/* Setup NAT on this expected conntrack so it follows master. */
|
||||||
|
|
|
@ -1851,7 +1851,7 @@ static int ip_route_input_mc(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
||||||
goto e_inval;
|
goto e_inval;
|
||||||
spec_dst = inet_select_addr(dev, 0, RT_SCOPE_LINK);
|
spec_dst = inet_select_addr(dev, 0, RT_SCOPE_LINK);
|
||||||
} else if (fib_validate_source(saddr, 0, tos, 0,
|
} else if (fib_validate_source(saddr, 0, tos, 0,
|
||||||
dev, &spec_dst, &itag) < 0)
|
dev, &spec_dst, &itag, 0) < 0)
|
||||||
goto e_inval;
|
goto e_inval;
|
||||||
|
|
||||||
rth = dst_alloc(&ipv4_dst_ops);
|
rth = dst_alloc(&ipv4_dst_ops);
|
||||||
|
@ -1964,7 +1964,7 @@ static int __mkroute_input(struct sk_buff *skb,
|
||||||
|
|
||||||
|
|
||||||
err = fib_validate_source(saddr, daddr, tos, FIB_RES_OIF(*res),
|
err = fib_validate_source(saddr, daddr, tos, FIB_RES_OIF(*res),
|
||||||
in_dev->dev, &spec_dst, &itag);
|
in_dev->dev, &spec_dst, &itag, skb->mark);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
ip_handle_martian_source(in_dev->dev, in_dev, skb, daddr,
|
ip_handle_martian_source(in_dev->dev, in_dev, skb, daddr,
|
||||||
saddr);
|
saddr);
|
||||||
|
@ -2138,7 +2138,7 @@ static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
||||||
int result;
|
int result;
|
||||||
result = fib_validate_source(saddr, daddr, tos,
|
result = fib_validate_source(saddr, daddr, tos,
|
||||||
net->loopback_dev->ifindex,
|
net->loopback_dev->ifindex,
|
||||||
dev, &spec_dst, &itag);
|
dev, &spec_dst, &itag, skb->mark);
|
||||||
if (result < 0)
|
if (result < 0)
|
||||||
goto martian_source;
|
goto martian_source;
|
||||||
if (result)
|
if (result)
|
||||||
|
@ -2167,7 +2167,7 @@ brd_input:
|
||||||
spec_dst = inet_select_addr(dev, 0, RT_SCOPE_LINK);
|
spec_dst = inet_select_addr(dev, 0, RT_SCOPE_LINK);
|
||||||
else {
|
else {
|
||||||
err = fib_validate_source(saddr, 0, tos, 0, dev, &spec_dst,
|
err = fib_validate_source(saddr, 0, tos, 0, dev, &spec_dst,
|
||||||
&itag);
|
&itag, skb->mark);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto martian_source;
|
goto martian_source;
|
||||||
if (err)
|
if (err)
|
||||||
|
|
|
@ -1005,9 +1005,7 @@ try_again:
|
||||||
err = ulen;
|
err = ulen;
|
||||||
|
|
||||||
out_free:
|
out_free:
|
||||||
lock_sock(sk);
|
skb_free_datagram_locked(sk, skb);
|
||||||
skb_free_datagram(sk, skb);
|
|
||||||
release_sock(sk);
|
|
||||||
out:
|
out:
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
|
|
@ -288,9 +288,7 @@ try_again:
|
||||||
err = ulen;
|
err = ulen;
|
||||||
|
|
||||||
out_free:
|
out_free:
|
||||||
lock_sock(sk);
|
skb_free_datagram_locked(sk, skb);
|
||||||
skb_free_datagram(sk, skb);
|
|
||||||
release_sock(sk);
|
|
||||||
out:
|
out:
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
|
|
@ -666,26 +666,25 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local,
|
||||||
|
|
||||||
state = &sta->ampdu_mlme.tid_state_tx[tid];
|
state = &sta->ampdu_mlme.tid_state_tx[tid];
|
||||||
|
|
||||||
|
del_timer_sync(&sta->ampdu_mlme.tid_tx[tid]->addba_resp_timer);
|
||||||
|
|
||||||
spin_lock_bh(&sta->lock);
|
spin_lock_bh(&sta->lock);
|
||||||
|
|
||||||
if (!(*state & HT_ADDBA_REQUESTED_MSK)) {
|
if (!(*state & HT_ADDBA_REQUESTED_MSK))
|
||||||
spin_unlock_bh(&sta->lock);
|
goto timer_still_needed;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mgmt->u.action.u.addba_resp.dialog_token !=
|
if (mgmt->u.action.u.addba_resp.dialog_token !=
|
||||||
sta->ampdu_mlme.tid_tx[tid]->dialog_token) {
|
sta->ampdu_mlme.tid_tx[tid]->dialog_token) {
|
||||||
spin_unlock_bh(&sta->lock);
|
|
||||||
#ifdef CONFIG_MAC80211_HT_DEBUG
|
#ifdef CONFIG_MAC80211_HT_DEBUG
|
||||||
printk(KERN_DEBUG "wrong addBA response token, tid %d\n", tid);
|
printk(KERN_DEBUG "wrong addBA response token, tid %d\n", tid);
|
||||||
#endif /* CONFIG_MAC80211_HT_DEBUG */
|
#endif /* CONFIG_MAC80211_HT_DEBUG */
|
||||||
return;
|
goto timer_still_needed;
|
||||||
}
|
}
|
||||||
|
|
||||||
del_timer_sync(&sta->ampdu_mlme.tid_tx[tid]->addba_resp_timer);
|
|
||||||
#ifdef CONFIG_MAC80211_HT_DEBUG
|
#ifdef CONFIG_MAC80211_HT_DEBUG
|
||||||
printk(KERN_DEBUG "switched off addBA timer for tid %d \n", tid);
|
printk(KERN_DEBUG "switched off addBA timer for tid %d \n", tid);
|
||||||
#endif /* CONFIG_MAC80211_HT_DEBUG */
|
#endif /* CONFIG_MAC80211_HT_DEBUG */
|
||||||
|
|
||||||
if (le16_to_cpu(mgmt->u.action.u.addba_resp.status)
|
if (le16_to_cpu(mgmt->u.action.u.addba_resp.status)
|
||||||
== WLAN_STATUS_SUCCESS) {
|
== WLAN_STATUS_SUCCESS) {
|
||||||
u8 curstate = *state;
|
u8 curstate = *state;
|
||||||
|
@ -699,5 +698,11 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local,
|
||||||
} else {
|
} else {
|
||||||
___ieee80211_stop_tx_ba_session(sta, tid, WLAN_BACK_INITIATOR);
|
___ieee80211_stop_tx_ba_session(sta, tid, WLAN_BACK_INITIATOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
timer_still_needed:
|
||||||
|
add_timer(&sta->ampdu_mlme.tid_tx[tid]->addba_resp_timer);
|
||||||
|
out:
|
||||||
spin_unlock_bh(&sta->lock);
|
spin_unlock_bh(&sta->lock);
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,6 +72,9 @@ static int ieee80211_change_iface(struct wiphy *wiphy,
|
||||||
struct ieee80211_sub_if_data *sdata;
|
struct ieee80211_sub_if_data *sdata;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (netif_running(dev))
|
||||||
|
return -EBUSY;
|
||||||
|
|
||||||
if (!nl80211_type_check(type))
|
if (!nl80211_type_check(type))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
@ -81,9 +84,6 @@ static int ieee80211_change_iface(struct wiphy *wiphy,
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (netif_running(sdata->dev))
|
|
||||||
return -EBUSY;
|
|
||||||
|
|
||||||
if (ieee80211_vif_is_mesh(&sdata->vif) && params->mesh_id_len)
|
if (ieee80211_vif_is_mesh(&sdata->vif) && params->mesh_id_len)
|
||||||
ieee80211_sdata_set_mesh_id(sdata,
|
ieee80211_sdata_set_mesh_id(sdata,
|
||||||
params->mesh_id_len,
|
params->mesh_id_len,
|
||||||
|
|
|
@ -153,7 +153,7 @@ void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata,
|
||||||
if (net_ratelimit())
|
if (net_ratelimit())
|
||||||
printk(KERN_DEBUG "delba from %pM (%s) tid %d reason code %d\n",
|
printk(KERN_DEBUG "delba from %pM (%s) tid %d reason code %d\n",
|
||||||
mgmt->sa, initiator ? "initiator" : "recipient", tid,
|
mgmt->sa, initiator ? "initiator" : "recipient", tid,
|
||||||
mgmt->u.action.u.delba.reason_code);
|
le16_to_cpu(mgmt->u.action.u.delba.reason_code));
|
||||||
#endif /* CONFIG_MAC80211_HT_DEBUG */
|
#endif /* CONFIG_MAC80211_HT_DEBUG */
|
||||||
|
|
||||||
if (initiator == WLAN_BACK_INITIATOR)
|
if (initiator == WLAN_BACK_INITIATOR)
|
||||||
|
|
|
@ -73,6 +73,7 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
||||||
struct ieee80211_mgmt *mgmt;
|
struct ieee80211_mgmt *mgmt;
|
||||||
u8 *pos;
|
u8 *pos;
|
||||||
struct ieee80211_supported_band *sband;
|
struct ieee80211_supported_band *sband;
|
||||||
|
struct cfg80211_bss *bss;
|
||||||
u32 bss_change;
|
u32 bss_change;
|
||||||
u8 supp_rates[IEEE80211_MAX_SUPP_RATES];
|
u8 supp_rates[IEEE80211_MAX_SUPP_RATES];
|
||||||
|
|
||||||
|
@ -177,8 +178,9 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
||||||
mod_timer(&ifibss->timer,
|
mod_timer(&ifibss->timer,
|
||||||
round_jiffies(jiffies + IEEE80211_IBSS_MERGE_INTERVAL));
|
round_jiffies(jiffies + IEEE80211_IBSS_MERGE_INTERVAL));
|
||||||
|
|
||||||
cfg80211_inform_bss_frame(local->hw.wiphy, local->hw.conf.channel,
|
bss = cfg80211_inform_bss_frame(local->hw.wiphy, local->hw.conf.channel,
|
||||||
mgmt, skb->len, 0, GFP_KERNEL);
|
mgmt, skb->len, 0, GFP_KERNEL);
|
||||||
|
cfg80211_put_bss(bss);
|
||||||
cfg80211_ibss_joined(sdata->dev, ifibss->bssid, GFP_KERNEL);
|
cfg80211_ibss_joined(sdata->dev, ifibss->bssid, GFP_KERNEL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1350,6 +1350,11 @@ err_stat:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s16 (*nf_ct_nat_offset)(const struct nf_conn *ct,
|
||||||
|
enum ip_conntrack_dir dir,
|
||||||
|
u32 seq);
|
||||||
|
EXPORT_SYMBOL_GPL(nf_ct_nat_offset);
|
||||||
|
|
||||||
int nf_conntrack_init(struct net *net)
|
int nf_conntrack_init(struct net *net)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -1367,6 +1372,9 @@ int nf_conntrack_init(struct net *net)
|
||||||
/* For use by REJECT target */
|
/* For use by REJECT target */
|
||||||
rcu_assign_pointer(ip_ct_attach, nf_conntrack_attach);
|
rcu_assign_pointer(ip_ct_attach, nf_conntrack_attach);
|
||||||
rcu_assign_pointer(nf_ct_destroy, destroy_conntrack);
|
rcu_assign_pointer(nf_ct_destroy, destroy_conntrack);
|
||||||
|
|
||||||
|
/* Howto get NAT offsets */
|
||||||
|
rcu_assign_pointer(nf_ct_nat_offset, NULL);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -492,6 +492,21 @@ static void tcp_sack(const struct sk_buff *skb, unsigned int dataoff,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_NF_NAT_NEEDED
|
||||||
|
static inline s16 nat_offset(const struct nf_conn *ct,
|
||||||
|
enum ip_conntrack_dir dir,
|
||||||
|
u32 seq)
|
||||||
|
{
|
||||||
|
typeof(nf_ct_nat_offset) get_offset = rcu_dereference(nf_ct_nat_offset);
|
||||||
|
|
||||||
|
return get_offset != NULL ? get_offset(ct, dir, seq) : 0;
|
||||||
|
}
|
||||||
|
#define NAT_OFFSET(pf, ct, dir, seq) \
|
||||||
|
(pf == NFPROTO_IPV4 ? nat_offset(ct, dir, seq) : 0)
|
||||||
|
#else
|
||||||
|
#define NAT_OFFSET(pf, ct, dir, seq) 0
|
||||||
|
#endif
|
||||||
|
|
||||||
static bool tcp_in_window(const struct nf_conn *ct,
|
static bool tcp_in_window(const struct nf_conn *ct,
|
||||||
struct ip_ct_tcp *state,
|
struct ip_ct_tcp *state,
|
||||||
enum ip_conntrack_dir dir,
|
enum ip_conntrack_dir dir,
|
||||||
|
@ -506,6 +521,7 @@ static bool tcp_in_window(const struct nf_conn *ct,
|
||||||
struct ip_ct_tcp_state *receiver = &state->seen[!dir];
|
struct ip_ct_tcp_state *receiver = &state->seen[!dir];
|
||||||
const struct nf_conntrack_tuple *tuple = &ct->tuplehash[dir].tuple;
|
const struct nf_conntrack_tuple *tuple = &ct->tuplehash[dir].tuple;
|
||||||
__u32 seq, ack, sack, end, win, swin;
|
__u32 seq, ack, sack, end, win, swin;
|
||||||
|
s16 receiver_offset;
|
||||||
bool res;
|
bool res;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -519,11 +535,16 @@ static bool tcp_in_window(const struct nf_conn *ct,
|
||||||
if (receiver->flags & IP_CT_TCP_FLAG_SACK_PERM)
|
if (receiver->flags & IP_CT_TCP_FLAG_SACK_PERM)
|
||||||
tcp_sack(skb, dataoff, tcph, &sack);
|
tcp_sack(skb, dataoff, tcph, &sack);
|
||||||
|
|
||||||
|
/* Take into account NAT sequence number mangling */
|
||||||
|
receiver_offset = NAT_OFFSET(pf, ct, !dir, ack - 1);
|
||||||
|
ack -= receiver_offset;
|
||||||
|
sack -= receiver_offset;
|
||||||
|
|
||||||
pr_debug("tcp_in_window: START\n");
|
pr_debug("tcp_in_window: START\n");
|
||||||
pr_debug("tcp_in_window: ");
|
pr_debug("tcp_in_window: ");
|
||||||
nf_ct_dump_tuple(tuple);
|
nf_ct_dump_tuple(tuple);
|
||||||
pr_debug("seq=%u ack=%u sack=%u win=%u end=%u\n",
|
pr_debug("seq=%u ack=%u+(%d) sack=%u+(%d) win=%u end=%u\n",
|
||||||
seq, ack, sack, win, end);
|
seq, ack, receiver_offset, sack, receiver_offset, win, end);
|
||||||
pr_debug("tcp_in_window: sender end=%u maxend=%u maxwin=%u scale=%i "
|
pr_debug("tcp_in_window: sender end=%u maxend=%u maxwin=%u scale=%i "
|
||||||
"receiver end=%u maxend=%u maxwin=%u scale=%i\n",
|
"receiver end=%u maxend=%u maxwin=%u scale=%i\n",
|
||||||
sender->td_end, sender->td_maxend, sender->td_maxwin,
|
sender->td_end, sender->td_maxend, sender->td_maxwin,
|
||||||
|
@ -613,8 +634,8 @@ static bool tcp_in_window(const struct nf_conn *ct,
|
||||||
|
|
||||||
pr_debug("tcp_in_window: ");
|
pr_debug("tcp_in_window: ");
|
||||||
nf_ct_dump_tuple(tuple);
|
nf_ct_dump_tuple(tuple);
|
||||||
pr_debug("seq=%u ack=%u sack =%u win=%u end=%u\n",
|
pr_debug("seq=%u ack=%u+(%d) sack=%u+(%d) win=%u end=%u\n",
|
||||||
seq, ack, sack, win, end);
|
seq, ack, receiver_offset, sack, receiver_offset, win, end);
|
||||||
pr_debug("tcp_in_window: sender end=%u maxend=%u maxwin=%u scale=%i "
|
pr_debug("tcp_in_window: sender end=%u maxend=%u maxwin=%u scale=%i "
|
||||||
"receiver end=%u maxend=%u maxwin=%u scale=%i\n",
|
"receiver end=%u maxend=%u maxwin=%u scale=%i\n",
|
||||||
sender->td_end, sender->td_maxend, sender->td_maxwin,
|
sender->td_end, sender->td_maxend, sender->td_maxwin,
|
||||||
|
@ -700,7 +721,7 @@ static bool tcp_in_window(const struct nf_conn *ct,
|
||||||
before(seq, sender->td_maxend + 1) ?
|
before(seq, sender->td_maxend + 1) ?
|
||||||
after(end, sender->td_end - receiver->td_maxwin - 1) ?
|
after(end, sender->td_end - receiver->td_maxwin - 1) ?
|
||||||
before(sack, receiver->td_end + 1) ?
|
before(sack, receiver->td_end + 1) ?
|
||||||
after(ack, receiver->td_end - MAXACKWINDOW(sender)) ? "BUG"
|
after(sack, receiver->td_end - MAXACKWINDOW(sender) - 1) ? "BUG"
|
||||||
: "ACK is under the lower bound (possible overly delayed ACK)"
|
: "ACK is under the lower bound (possible overly delayed ACK)"
|
||||||
: "ACK is over the upper bound (ACKed data not seen yet)"
|
: "ACK is over the upper bound (ACKed data not seen yet)"
|
||||||
: "SEQ is under the lower bound (already ACKed data retransmitted)"
|
: "SEQ is under the lower bound (already ACKed data retransmitted)"
|
||||||
|
@ -715,39 +736,6 @@ static bool tcp_in_window(const struct nf_conn *ct,
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_NF_NAT_NEEDED
|
|
||||||
/* Update sender->td_end after NAT successfully mangled the packet */
|
|
||||||
/* Caller must linearize skb at tcp header. */
|
|
||||||
void nf_conntrack_tcp_update(const struct sk_buff *skb,
|
|
||||||
unsigned int dataoff,
|
|
||||||
struct nf_conn *ct, int dir,
|
|
||||||
s16 offset)
|
|
||||||
{
|
|
||||||
const struct tcphdr *tcph = (const void *)skb->data + dataoff;
|
|
||||||
const struct ip_ct_tcp_state *sender = &ct->proto.tcp.seen[dir];
|
|
||||||
const struct ip_ct_tcp_state *receiver = &ct->proto.tcp.seen[!dir];
|
|
||||||
__u32 end;
|
|
||||||
|
|
||||||
end = segment_seq_plus_len(ntohl(tcph->seq), skb->len, dataoff, tcph);
|
|
||||||
|
|
||||||
spin_lock_bh(&ct->lock);
|
|
||||||
/*
|
|
||||||
* We have to worry for the ack in the reply packet only...
|
|
||||||
*/
|
|
||||||
if (ct->proto.tcp.seen[dir].td_end + offset == end)
|
|
||||||
ct->proto.tcp.seen[dir].td_end = end;
|
|
||||||
ct->proto.tcp.last_end = end;
|
|
||||||
spin_unlock_bh(&ct->lock);
|
|
||||||
pr_debug("tcp_update: sender end=%u maxend=%u maxwin=%u scale=%i "
|
|
||||||
"receiver end=%u maxend=%u maxwin=%u scale=%i\n",
|
|
||||||
sender->td_end, sender->td_maxend, sender->td_maxwin,
|
|
||||||
sender->td_scale,
|
|
||||||
receiver->td_end, receiver->td_maxend, receiver->td_maxwin,
|
|
||||||
receiver->td_scale);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(nf_conntrack_tcp_update);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define TH_FIN 0x01
|
#define TH_FIN 0x01
|
||||||
#define TH_SYN 0x02
|
#define TH_SYN 0x02
|
||||||
#define TH_RST 0x04
|
#define TH_RST 0x04
|
||||||
|
|
|
@ -578,18 +578,18 @@ static int rose_clear_routes(void)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check that the device given is a valid AX.25 interface that is "up".
|
* Check that the device given is a valid AX.25 interface that is "up".
|
||||||
|
* called whith RTNL
|
||||||
*/
|
*/
|
||||||
static struct net_device *rose_ax25_dev_get(char *devname)
|
static struct net_device *rose_ax25_dev_find(char *devname)
|
||||||
{
|
{
|
||||||
struct net_device *dev;
|
struct net_device *dev;
|
||||||
|
|
||||||
if ((dev = dev_get_by_name(&init_net, devname)) == NULL)
|
if ((dev = __dev_get_by_name(&init_net, devname)) == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if ((dev->flags & IFF_UP) && dev->type == ARPHRD_AX25)
|
if ((dev->flags & IFF_UP) && dev->type == ARPHRD_AX25)
|
||||||
return dev;
|
return dev;
|
||||||
|
|
||||||
dev_put(dev);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -720,27 +720,23 @@ int rose_rt_ioctl(unsigned int cmd, void __user *arg)
|
||||||
case SIOCADDRT:
|
case SIOCADDRT:
|
||||||
if (copy_from_user(&rose_route, arg, sizeof(struct rose_route_struct)))
|
if (copy_from_user(&rose_route, arg, sizeof(struct rose_route_struct)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
if ((dev = rose_ax25_dev_get(rose_route.device)) == NULL)
|
if ((dev = rose_ax25_dev_find(rose_route.device)) == NULL)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (rose_dev_exists(&rose_route.address)) { /* Can't add routes to ourself */
|
if (rose_dev_exists(&rose_route.address)) /* Can't add routes to ourself */
|
||||||
dev_put(dev);
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
|
||||||
if (rose_route.mask > 10) /* Mask can't be more than 10 digits */
|
if (rose_route.mask > 10) /* Mask can't be more than 10 digits */
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (rose_route.ndigis > AX25_MAX_DIGIS)
|
if (rose_route.ndigis > AX25_MAX_DIGIS)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
err = rose_add_node(&rose_route, dev);
|
err = rose_add_node(&rose_route, dev);
|
||||||
dev_put(dev);
|
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
case SIOCDELRT:
|
case SIOCDELRT:
|
||||||
if (copy_from_user(&rose_route, arg, sizeof(struct rose_route_struct)))
|
if (copy_from_user(&rose_route, arg, sizeof(struct rose_route_struct)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
if ((dev = rose_ax25_dev_get(rose_route.device)) == NULL)
|
if ((dev = rose_ax25_dev_find(rose_route.device)) == NULL)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
err = rose_del_node(&rose_route, dev);
|
err = rose_del_node(&rose_route, dev);
|
||||||
dev_put(dev);
|
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
case SIOCRSCLRRT:
|
case SIOCRSCLRRT:
|
||||||
|
|
|
@ -111,7 +111,7 @@ static void svc_release_skb(struct svc_rqst *rqstp)
|
||||||
rqstp->rq_xprt_ctxt = NULL;
|
rqstp->rq_xprt_ctxt = NULL;
|
||||||
|
|
||||||
dprintk("svc: service %p, releasing skb %p\n", rqstp, skb);
|
dprintk("svc: service %p, releasing skb %p\n", rqstp, skb);
|
||||||
skb_free_datagram(svsk->sk_sk, skb);
|
skb_free_datagram_locked(svsk->sk_sk, skb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -578,7 +578,7 @@ static int svc_udp_recvfrom(struct svc_rqst *rqstp)
|
||||||
"svc: received unknown control message %d/%d; "
|
"svc: received unknown control message %d/%d; "
|
||||||
"dropping RPC reply datagram\n",
|
"dropping RPC reply datagram\n",
|
||||||
cmh->cmsg_level, cmh->cmsg_type);
|
cmh->cmsg_level, cmh->cmsg_type);
|
||||||
skb_free_datagram(svsk->sk_sk, skb);
|
skb_free_datagram_locked(svsk->sk_sk, skb);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -588,18 +588,18 @@ static int svc_udp_recvfrom(struct svc_rqst *rqstp)
|
||||||
if (csum_partial_copy_to_xdr(&rqstp->rq_arg, skb)) {
|
if (csum_partial_copy_to_xdr(&rqstp->rq_arg, skb)) {
|
||||||
local_bh_enable();
|
local_bh_enable();
|
||||||
/* checksum error */
|
/* checksum error */
|
||||||
skb_free_datagram(svsk->sk_sk, skb);
|
skb_free_datagram_locked(svsk->sk_sk, skb);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
local_bh_enable();
|
local_bh_enable();
|
||||||
skb_free_datagram(svsk->sk_sk, skb);
|
skb_free_datagram_locked(svsk->sk_sk, skb);
|
||||||
} else {
|
} else {
|
||||||
/* we can use it in-place */
|
/* we can use it in-place */
|
||||||
rqstp->rq_arg.head[0].iov_base = skb->data +
|
rqstp->rq_arg.head[0].iov_base = skb->data +
|
||||||
sizeof(struct udphdr);
|
sizeof(struct udphdr);
|
||||||
rqstp->rq_arg.head[0].iov_len = len;
|
rqstp->rq_arg.head[0].iov_len = len;
|
||||||
if (skb_checksum_complete(skb)) {
|
if (skb_checksum_complete(skb)) {
|
||||||
skb_free_datagram(svsk->sk_sk, skb);
|
skb_free_datagram_locked(svsk->sk_sk, skb);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
rqstp->rq_xprt_ctxt = skb;
|
rqstp->rq_xprt_ctxt = skb;
|
||||||
|
|
|
@ -165,7 +165,7 @@ void cfg80211_conn_work(struct work_struct *work)
|
||||||
struct cfg80211_registered_device *rdev =
|
struct cfg80211_registered_device *rdev =
|
||||||
container_of(work, struct cfg80211_registered_device, conn_work);
|
container_of(work, struct cfg80211_registered_device, conn_work);
|
||||||
struct wireless_dev *wdev;
|
struct wireless_dev *wdev;
|
||||||
u8 bssid[ETH_ALEN];
|
u8 bssid_buf[ETH_ALEN], *bssid = NULL;
|
||||||
|
|
||||||
rtnl_lock();
|
rtnl_lock();
|
||||||
cfg80211_lock_rdev(rdev);
|
cfg80211_lock_rdev(rdev);
|
||||||
|
@ -181,7 +181,10 @@ void cfg80211_conn_work(struct work_struct *work)
|
||||||
wdev_unlock(wdev);
|
wdev_unlock(wdev);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
memcpy(bssid, wdev->conn->params.bssid, ETH_ALEN);
|
if (wdev->conn->params.bssid) {
|
||||||
|
memcpy(bssid_buf, wdev->conn->params.bssid, ETH_ALEN);
|
||||||
|
bssid = bssid_buf;
|
||||||
|
}
|
||||||
if (cfg80211_conn_do_work(wdev))
|
if (cfg80211_conn_do_work(wdev))
|
||||||
__cfg80211_connect_result(
|
__cfg80211_connect_result(
|
||||||
wdev->netdev, bssid,
|
wdev->netdev, bssid,
|
||||||
|
|
Loading…
Reference in a new issue