You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (39 commits) Revert "p54: Use SKB list handling helpers instead of by-hand code." sctp: fix warning at inet_sock_destruct() while release sctp socket tun/tap: Fix crashes if open() /dev/net/tun and then poll() it. dsa: fix 88e6xxx statistics counter snapshotting forcedeth: Fix NAPI race. drivers/net/smsc911x.c: Fix resource size off by 1 error pcnet_cs: add new id bnx2x: Fix the maximal values of coalescing timeouts. bnx2x: Disable HC coalescing when setting timeout to zero. tun: Fix device unregister race be2net: fix spurious interrupt handling in intx mode e1000e: disable K1 at 1000Mbps for 82577/82578 e1000e: delay second read of PHY_STATUS register on failure of first read e1000e: prevent NVM corruption on sectors larger than 4K e1000e: do not write SmartSpeed register bits on parts without support e1000e: delay after LCD reset and proper checks for PHY configuration done e1000e: PHY loopback broken on 82578 ixgbe: Not allow 8259x unsupported wol options change from ethtool ixgbe: fix inconsistent SFP/SFP+ failure results. ixgbe: fix regression on some 82598 adapters ...
This commit is contained in:
@@ -294,32 +294,33 @@ struct reply_t gigaset_tab_cid[] =
|
||||
{RSP_OK, 604,604, -1, 605, 5, {ACT_CMD+AT_MSN}},
|
||||
{RSP_OK, 605,605, -1, 606, 5, {ACT_CMD+AT_ISO}},
|
||||
{RSP_NULL, 605,605, -1, 606, 5, {ACT_CMD+AT_ISO}},
|
||||
{RSP_OK, 606,606, -1, 607, 5, {0}, "+VLS=17\r"}, /* set "Endgeraetemodus" */
|
||||
{RSP_OK, 606,606, -1, 607, 5, {0}, "+VLS=17\r"},
|
||||
{RSP_OK, 607,607, -1, 608,-1},
|
||||
//{RSP_ZSAU, 608,608,ZSAU_PROCEEDING, 608, 0, {ACT_ERROR}},//DELETE
|
||||
{RSP_ZSAU, 608,608,ZSAU_PROCEEDING, 609, 5, {ACT_CMD+AT_DIAL}},
|
||||
{RSP_OK, 609,609, -1, 650, 0, {ACT_DIALING}},
|
||||
|
||||
{RSP_ZVLS, 608,608, 17, -1,-1, {ACT_DEBUG}},
|
||||
{RSP_ZCTP, 609,609, -1, -1,-1, {ACT_DEBUG}},
|
||||
{RSP_ZCPN, 609,609, -1, -1,-1, {ACT_DEBUG}},
|
||||
{RSP_ERROR, 601,609, -1, 0, 0, {ACT_ABORTDIAL}},
|
||||
{EV_TIMEOUT, 601,609, -1, 0, 0, {ACT_ABORTDIAL}},
|
||||
|
||||
/* dialing */
|
||||
{RSP_ZCTP, 650,650, -1, -1,-1, {ACT_DEBUG}},
|
||||
{RSP_ZCPN, 650,650, -1, -1,-1, {ACT_DEBUG}},
|
||||
{RSP_ZSAU, 650,650,ZSAU_CALL_DELIVERED, -1,-1, {ACT_DEBUG}}, /* some devices don't send this */
|
||||
/* optional dialing responses */
|
||||
{EV_BC_OPEN, 650,650, -1, 651,-1},
|
||||
{RSP_ZVLS, 608,651, 17, -1,-1, {ACT_DEBUG}},
|
||||
{RSP_ZCTP, 609,651, -1, -1,-1, {ACT_DEBUG}},
|
||||
{RSP_ZCPN, 609,651, -1, -1,-1, {ACT_DEBUG}},
|
||||
{RSP_ZSAU, 650,651,ZSAU_CALL_DELIVERED, -1,-1, {ACT_DEBUG}},
|
||||
|
||||
/* connection established */
|
||||
{RSP_ZSAU, 650,650,ZSAU_ACTIVE, 800,-1, {ACT_CONNECT}}, //FIXME -> DLE1
|
||||
{RSP_ZSAU, 750,750,ZSAU_ACTIVE, 800,-1, {ACT_CONNECT}}, //FIXME -> DLE1
|
||||
|
||||
{EV_BC_OPEN, 800,800, -1, 800,-1, {ACT_NOTIFY_BC_UP}}, //FIXME new constate + timeout
|
||||
/* connect */
|
||||
{RSP_ZSAU, 650,650,ZSAU_ACTIVE, 800,-1, {ACT_CONNECT}},
|
||||
{RSP_ZSAU, 651,651,ZSAU_ACTIVE, 800,-1, {ACT_CONNECT,
|
||||
ACT_NOTIFY_BC_UP}},
|
||||
{RSP_ZSAU, 750,750,ZSAU_ACTIVE, 800,-1, {ACT_CONNECT}},
|
||||
{RSP_ZSAU, 751,751,ZSAU_ACTIVE, 800,-1, {ACT_CONNECT,
|
||||
ACT_NOTIFY_BC_UP}},
|
||||
{EV_BC_OPEN, 800,800, -1, 800,-1, {ACT_NOTIFY_BC_UP}},
|
||||
|
||||
/* remote hangup */
|
||||
{RSP_ZSAU, 650,650,ZSAU_DISCONNECT_IND, 0, 0, {ACT_REMOTEREJECT}},
|
||||
{RSP_ZSAU, 750,750,ZSAU_DISCONNECT_IND, 0, 0, {ACT_REMOTEHUP}},
|
||||
{RSP_ZSAU, 650,651,ZSAU_DISCONNECT_IND, 0, 0, {ACT_REMOTEREJECT}},
|
||||
{RSP_ZSAU, 750,751,ZSAU_DISCONNECT_IND, 0, 0, {ACT_REMOTEHUP}},
|
||||
{RSP_ZSAU, 800,800,ZSAU_DISCONNECT_IND, 0, 0, {ACT_REMOTEHUP}},
|
||||
|
||||
/* hangup */
|
||||
@@ -358,7 +359,8 @@ struct reply_t gigaset_tab_cid[] =
|
||||
{RSP_ZSAU, 700,729,ZSAU_ACTIVE, 0, 0, {ACT_ABORTACCEPT}},
|
||||
{RSP_ZSAU, 700,729,ZSAU_DISCONNECT_IND, 0, 0, {ACT_ABORTACCEPT}},
|
||||
|
||||
{EV_TIMEOUT, 750,750, -1, 0, 0, {ACT_CONNTIMEOUT}},
|
||||
{EV_BC_OPEN, 750,750, -1, 751,-1},
|
||||
{EV_TIMEOUT, 750,751, -1, 0, 0, {ACT_CONNTIMEOUT}},
|
||||
|
||||
/* B channel closed (general case) */
|
||||
{EV_BC_CLOSED, -1, -1, -1, -1,-1, {ACT_NOTIFY_BC_DOWN}}, //FIXME
|
||||
@@ -876,12 +878,6 @@ static void bchannel_down(struct bc_state *bcs)
|
||||
|
||||
static void bchannel_up(struct bc_state *bcs)
|
||||
{
|
||||
if (!(bcs->chstate & CHS_D_UP)) {
|
||||
dev_notice(bcs->cs->dev, "%s: D channel not up\n", __func__);
|
||||
bcs->chstate |= CHS_D_UP;
|
||||
gigaset_i4l_channel_cmd(bcs, ISDN_STAT_DCONN);
|
||||
}
|
||||
|
||||
if (bcs->chstate & CHS_B_UP) {
|
||||
dev_notice(bcs->cs->dev, "%s: B channel already up\n",
|
||||
__func__);
|
||||
|
||||
@@ -174,12 +174,6 @@ int gigaset_isowbuf_getbytes(struct isowbuf_t *iwb, int size)
|
||||
pr_err("invalid size %d\n", size);
|
||||
return -EINVAL;
|
||||
}
|
||||
src = iwb->read;
|
||||
if (unlikely(limit >= BAS_OUTBUFSIZE + BAS_OUTBUFPAD ||
|
||||
(read < src && limit >= src))) {
|
||||
pr_err("isoc write buffer frame reservation violated\n");
|
||||
return -EFAULT;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (read < write) {
|
||||
|
||||
@@ -55,6 +55,10 @@
|
||||
#define MEMBAR_CTRL_INT_CTRL_PFUNC_MASK 0x7 /* bits 26 - 28 */
|
||||
#define MEMBAR_CTRL_INT_CTRL_PFUNC_SHIFT 26
|
||||
|
||||
/********* ISR0 Register offset **********/
|
||||
#define CEV_ISR0_OFFSET 0xC18
|
||||
#define CEV_ISR_SIZE 4
|
||||
|
||||
/********* Event Q door bell *************/
|
||||
#define DB_EQ_OFFSET DB_CQ_OFFSET
|
||||
#define DB_EQ_RING_ID_MASK 0x1FF /* bits 0 - 8 */
|
||||
|
||||
@@ -1274,15 +1274,17 @@ static irqreturn_t be_intx(int irq, void *dev)
|
||||
{
|
||||
struct be_adapter *adapter = dev;
|
||||
struct be_ctrl_info *ctrl = &adapter->ctrl;
|
||||
int rx, tx;
|
||||
int isr;
|
||||
|
||||
tx = event_handle(ctrl, &adapter->tx_eq);
|
||||
rx = event_handle(ctrl, &adapter->rx_eq);
|
||||
isr = ioread32(ctrl->csr + CEV_ISR0_OFFSET +
|
||||
ctrl->pci_func * CEV_ISR_SIZE);
|
||||
if (!isr)
|
||||
return IRQ_NONE;
|
||||
|
||||
if (rx || tx)
|
||||
return IRQ_HANDLED;
|
||||
else
|
||||
return IRQ_NONE;
|
||||
event_handle(ctrl, &adapter->tx_eq);
|
||||
event_handle(ctrl, &adapter->rx_eq);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static irqreturn_t be_msix_rx(int irq, void *dev)
|
||||
|
||||
@@ -902,6 +902,8 @@ struct bnx2x {
|
||||
u16 rx_quick_cons_trip;
|
||||
u16 rx_ticks_int;
|
||||
u16 rx_ticks;
|
||||
/* Maximal coalescing timeout in us */
|
||||
#define BNX2X_MAX_COALESCE_TOUT (0xf0*12)
|
||||
|
||||
u32 lin_cnt;
|
||||
|
||||
|
||||
@@ -4434,7 +4434,7 @@ static void bnx2x_update_coalesce(struct bnx2x *bp)
|
||||
REG_WR16(bp, BAR_USTRORM_INTMEM +
|
||||
USTORM_SB_HC_DISABLE_OFFSET(port, sb_id,
|
||||
U_SB_ETH_RX_CQ_INDEX),
|
||||
bp->rx_ticks ? 0 : 1);
|
||||
(bp->rx_ticks/12) ? 0 : 1);
|
||||
|
||||
/* HC_INDEX_C_ETH_TX_CQ_CONS */
|
||||
REG_WR8(bp, BAR_CSTRORM_INTMEM +
|
||||
@@ -4444,7 +4444,7 @@ static void bnx2x_update_coalesce(struct bnx2x *bp)
|
||||
REG_WR16(bp, BAR_CSTRORM_INTMEM +
|
||||
CSTORM_SB_HC_DISABLE_OFFSET(port, sb_id,
|
||||
C_SB_ETH_TX_CQ_INDEX),
|
||||
bp->tx_ticks ? 0 : 1);
|
||||
(bp->tx_ticks/12) ? 0 : 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9069,12 +9069,12 @@ static int bnx2x_set_coalesce(struct net_device *dev,
|
||||
struct bnx2x *bp = netdev_priv(dev);
|
||||
|
||||
bp->rx_ticks = (u16) coal->rx_coalesce_usecs;
|
||||
if (bp->rx_ticks > 3000)
|
||||
bp->rx_ticks = 3000;
|
||||
if (bp->rx_ticks > BNX2X_MAX_COALESCE_TOUT)
|
||||
bp->rx_ticks = BNX2X_MAX_COALESCE_TOUT;
|
||||
|
||||
bp->tx_ticks = (u16) coal->tx_coalesce_usecs;
|
||||
if (bp->tx_ticks > 0x3000)
|
||||
bp->tx_ticks = 0x3000;
|
||||
if (bp->tx_ticks > BNX2X_MAX_COALESCE_TOUT)
|
||||
bp->tx_ticks = BNX2X_MAX_COALESCE_TOUT;
|
||||
|
||||
if (netif_running(dev))
|
||||
bnx2x_update_coalesce(bp);
|
||||
|
||||
@@ -238,6 +238,7 @@
|
||||
#define E1000_STATUS_SPEED_100 0x00000040 /* Speed 100Mb/s */
|
||||
#define E1000_STATUS_SPEED_1000 0x00000080 /* Speed 1000Mb/s */
|
||||
#define E1000_STATUS_LAN_INIT_DONE 0x00000200 /* Lan Init Completion by NVM */
|
||||
#define E1000_STATUS_PHYRA 0x00000400 /* PHY Reset Asserted */
|
||||
#define E1000_STATUS_GIO_MASTER_ENABLE 0x00080000 /* Status of Master requests. */
|
||||
|
||||
/* Constants used to interpret the masked PCI-X bus speed. */
|
||||
@@ -575,6 +576,8 @@
|
||||
#define PHY_1000T_STATUS 0x0A /* 1000Base-T Status Reg */
|
||||
#define PHY_EXT_STATUS 0x0F /* Extended Status Reg */
|
||||
|
||||
#define PHY_CONTROL_LB 0x4000 /* PHY Loopback bit */
|
||||
|
||||
/* NVM Control */
|
||||
#define E1000_EECD_SK 0x00000001 /* NVM Clock */
|
||||
#define E1000_EECD_CS 0x00000002 /* NVM Chip Select */
|
||||
|
||||
@@ -215,6 +215,7 @@ enum e1e_registers {
|
||||
E1000_SWSM = 0x05B50, /* SW Semaphore */
|
||||
E1000_FWSM = 0x05B54, /* FW Semaphore */
|
||||
E1000_SWSM2 = 0x05B58, /* Driver-only SW semaphore */
|
||||
E1000_CRC_OFFSET = 0x05F50, /* CRC Offset register */
|
||||
E1000_HICR = 0x08F00, /* Host Interface Control */
|
||||
};
|
||||
|
||||
@@ -302,6 +303,9 @@ enum e1e_registers {
|
||||
#define E1000_KMRNCTRLSTA_REN 0x00200000
|
||||
#define E1000_KMRNCTRLSTA_DIAG_OFFSET 0x3 /* Kumeran Diagnostic */
|
||||
#define E1000_KMRNCTRLSTA_DIAG_NELPBK 0x1000 /* Nearend Loopback mode */
|
||||
#define E1000_KMRNCTRLSTA_K1_CONFIG 0x7
|
||||
#define E1000_KMRNCTRLSTA_K1_ENABLE 0x140E
|
||||
#define E1000_KMRNCTRLSTA_K1_DISABLE 0x1400
|
||||
|
||||
#define IFE_PHY_EXTENDED_STATUS_CONTROL 0x10
|
||||
#define IFE_PHY_SPECIAL_CONTROL 0x11 /* 100BaseTx PHY Special Control */
|
||||
|
||||
+219
-51
@@ -338,6 +338,7 @@ static s32 e1000_init_nvm_params_ich8lan(struct e1000_hw *hw)
|
||||
{
|
||||
struct e1000_nvm_info *nvm = &hw->nvm;
|
||||
struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan;
|
||||
union ich8_hws_flash_status hsfsts;
|
||||
u32 gfpreg;
|
||||
u32 sector_base_addr;
|
||||
u32 sector_end_addr;
|
||||
@@ -374,6 +375,20 @@ static s32 e1000_init_nvm_params_ich8lan(struct e1000_hw *hw)
|
||||
/* Adjust to word count */
|
||||
nvm->flash_bank_size /= sizeof(u16);
|
||||
|
||||
/*
|
||||
* Make sure the flash bank size does not overwrite the 4k
|
||||
* sector ranges. We may have 64k allotted to us but we only care
|
||||
* about the first 2 4k sectors. Therefore, if we have anything less
|
||||
* than 64k set in the HSFSTS register, we will reduce the bank size
|
||||
* down to 4k and let the rest remain unused. If berasesz == 3, then
|
||||
* we are working in 64k mode. Otherwise we are not.
|
||||
*/
|
||||
if (nvm->flash_bank_size > E1000_ICH8_SHADOW_RAM_WORDS) {
|
||||
hsfsts.regval = er16flash(ICH_FLASH_HSFSTS);
|
||||
if (hsfsts.hsf_status.berasesz != 3)
|
||||
nvm->flash_bank_size = E1000_ICH8_SHADOW_RAM_WORDS;
|
||||
}
|
||||
|
||||
nvm->word_size = E1000_ICH8_SHADOW_RAM_WORDS;
|
||||
|
||||
/* Clear shadow ram */
|
||||
@@ -446,6 +461,95 @@ static s32 e1000_init_mac_params_ich8lan(struct e1000_adapter *adapter)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* e1000_check_for_copper_link_ich8lan - Check for link (Copper)
|
||||
* @hw: pointer to the HW structure
|
||||
*
|
||||
* Checks to see of the link status of the hardware has changed. If a
|
||||
* change in link status has been detected, then we read the PHY registers
|
||||
* to get the current speed/duplex if link exists.
|
||||
**/
|
||||
static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
|
||||
{
|
||||
struct e1000_mac_info *mac = &hw->mac;
|
||||
s32 ret_val;
|
||||
bool link;
|
||||
|
||||
/*
|
||||
* We only want to go out to the PHY registers to see if Auto-Neg
|
||||
* has completed and/or if our link status has changed. The
|
||||
* get_link_status flag is set upon receiving a Link Status
|
||||
* Change or Rx Sequence Error interrupt.
|
||||
*/
|
||||
if (!mac->get_link_status) {
|
||||
ret_val = 0;
|
||||
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
|
||||
* link. If so, then we want to get the current speed/duplex
|
||||
* of the PHY.
|
||||
*/
|
||||
ret_val = e1000e_phy_has_link_generic(hw, 1, 0, &link);
|
||||
if (ret_val)
|
||||
goto out;
|
||||
|
||||
if (!link)
|
||||
goto out; /* No link detected */
|
||||
|
||||
mac->get_link_status = false;
|
||||
|
||||
if (hw->phy.type == e1000_phy_82578) {
|
||||
ret_val = e1000_link_stall_workaround_hv(hw);
|
||||
if (ret_val)
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if there was DownShift, must be checked
|
||||
* immediately after link-up
|
||||
*/
|
||||
e1000e_check_downshift(hw);
|
||||
|
||||
/*
|
||||
* If we are forcing speed/duplex, then we simply return since
|
||||
* we have already determined whether we have link or not.
|
||||
*/
|
||||
if (!mac->autoneg) {
|
||||
ret_val = -E1000_ERR_CONFIG;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* Auto-Neg is enabled. Auto Speed Detection takes care
|
||||
* of MAC speed/duplex configuration. So we only need to
|
||||
* configure Collision Distance in the MAC.
|
||||
*/
|
||||
e1000e_config_collision_dist(hw);
|
||||
|
||||
/*
|
||||
* Configure Flow Control now that Auto-Neg has completed.
|
||||
* First, we need to restore the desired flow control
|
||||
* settings because we may have had to re-autoneg with a
|
||||
* different link partner.
|
||||
*/
|
||||
ret_val = e1000e_config_fc_after_link_up(hw);
|
||||
if (ret_val)
|
||||
hw_dbg(hw, "Error configuring flow control\n");
|
||||
|
||||
out:
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
static s32 e1000_get_variants_ich8lan(struct e1000_adapter *adapter)
|
||||
{
|
||||
struct e1000_hw *hw = &adapter->hw;
|
||||
@@ -693,6 +797,38 @@ static s32 e1000_hv_phy_workarounds_ich8lan(struct e1000_hw *hw)
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
/**
|
||||
* e1000_lan_init_done_ich8lan - Check for PHY config completion
|
||||
* @hw: pointer to the HW structure
|
||||
*
|
||||
* Check the appropriate indication the MAC has finished configuring the
|
||||
* PHY after a software reset.
|
||||
**/
|
||||
static void e1000_lan_init_done_ich8lan(struct e1000_hw *hw)
|
||||
{
|
||||
u32 data, loop = E1000_ICH8_LAN_INIT_TIMEOUT;
|
||||
|
||||
/* Wait for basic configuration completes before proceeding */
|
||||
do {
|
||||
data = er32(STATUS);
|
||||
data &= E1000_STATUS_LAN_INIT_DONE;
|
||||
udelay(100);
|
||||
} while ((!data) && --loop);
|
||||
|
||||
/*
|
||||
* If basic configuration is incomplete before the above loop
|
||||
* count reaches 0, loading the configuration from NVM will
|
||||
* leave the PHY in a bad state possibly resulting in no link.
|
||||
*/
|
||||
if (loop == 0)
|
||||
hw_dbg(hw, "LAN_INIT_DONE not set, increase timeout\n");
|
||||
|
||||
/* Clear the Init Done bit for the next init event */
|
||||
data = er32(STATUS);
|
||||
data &= ~E1000_STATUS_LAN_INIT_DONE;
|
||||
ew32(STATUS, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* e1000_phy_hw_reset_ich8lan - Performs a PHY reset
|
||||
* @hw: pointer to the HW structure
|
||||
@@ -707,13 +843,15 @@ static s32 e1000_phy_hw_reset_ich8lan(struct e1000_hw *hw)
|
||||
u32 i;
|
||||
u32 data, cnf_size, cnf_base_addr, sw_cfg_mask;
|
||||
s32 ret_val;
|
||||
u16 loop = E1000_ICH8_LAN_INIT_TIMEOUT;
|
||||
u16 word_addr, reg_data, reg_addr, phy_page = 0;
|
||||
|
||||
ret_val = e1000e_phy_hw_reset_generic(hw);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
|
||||
/* Allow time for h/w to get to a quiescent state after reset */
|
||||
mdelay(10);
|
||||
|
||||
if (hw->mac.type == e1000_pchlan) {
|
||||
ret_val = e1000_hv_phy_workarounds_ich8lan(hw);
|
||||
if (ret_val)
|
||||
@@ -741,26 +879,8 @@ static s32 e1000_phy_hw_reset_ich8lan(struct e1000_hw *hw)
|
||||
if (!(data & sw_cfg_mask))
|
||||
return 0;
|
||||
|
||||
/* Wait for basic configuration completes before proceeding*/
|
||||
do {
|
||||
data = er32(STATUS);
|
||||
data &= E1000_STATUS_LAN_INIT_DONE;
|
||||
udelay(100);
|
||||
} while ((!data) && --loop);
|
||||
|
||||
/*
|
||||
* If basic configuration is incomplete before the above loop
|
||||
* count reaches 0, loading the configuration from NVM will
|
||||
* leave the PHY in a bad state possibly resulting in no link.
|
||||
*/
|
||||
if (loop == 0) {
|
||||
hw_dbg(hw, "LAN_INIT_DONE not set, increase timeout\n");
|
||||
}
|
||||
|
||||
/* Clear the Init Done bit for the next init event */
|
||||
data = er32(STATUS);
|
||||
data &= ~E1000_STATUS_LAN_INIT_DONE;
|
||||
ew32(STATUS, data);
|
||||
/* Wait for basic configuration completes before proceeding */
|
||||
e1000_lan_init_done_ich8lan(hw);
|
||||
|
||||
/*
|
||||
* Make sure HW does not configure LCD from PHY
|
||||
@@ -961,12 +1081,14 @@ static s32 e1000_set_d0_lplu_state_ich8lan(struct e1000_hw *hw, bool active)
|
||||
phy_ctrl |= E1000_PHY_CTRL_D0A_LPLU;
|
||||
ew32(PHY_CTRL, phy_ctrl);
|
||||
|
||||
if (phy->type != e1000_phy_igp_3)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* Call gig speed drop workaround on LPLU before accessing
|
||||
* any PHY registers
|
||||
*/
|
||||
if ((hw->mac.type == e1000_ich8lan) &&
|
||||
(hw->phy.type == e1000_phy_igp_3))
|
||||
if (hw->mac.type == e1000_ich8lan)
|
||||
e1000e_gig_downshift_workaround_ich8lan(hw);
|
||||
|
||||
/* When LPLU is enabled, we should disable SmartSpeed */
|
||||
@@ -979,6 +1101,9 @@ static s32 e1000_set_d0_lplu_state_ich8lan(struct e1000_hw *hw, bool active)
|
||||
phy_ctrl &= ~E1000_PHY_CTRL_D0A_LPLU;
|
||||
ew32(PHY_CTRL, phy_ctrl);
|
||||
|
||||
if (phy->type != e1000_phy_igp_3)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* LPLU and SmartSpeed are mutually exclusive. LPLU is used
|
||||
* during Dx states where the power conservation is most
|
||||
@@ -1038,6 +1163,10 @@ static s32 e1000_set_d3_lplu_state_ich8lan(struct e1000_hw *hw, bool active)
|
||||
if (!active) {
|
||||
phy_ctrl &= ~E1000_PHY_CTRL_NOND0A_LPLU;
|
||||
ew32(PHY_CTRL, phy_ctrl);
|
||||
|
||||
if (phy->type != e1000_phy_igp_3)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* LPLU and SmartSpeed are mutually exclusive. LPLU is used
|
||||
* during Dx states where the power conservation is most
|
||||
@@ -1073,12 +1202,14 @@ static s32 e1000_set_d3_lplu_state_ich8lan(struct e1000_hw *hw, bool active)
|
||||
phy_ctrl |= E1000_PHY_CTRL_NOND0A_LPLU;
|
||||
ew32(PHY_CTRL, phy_ctrl);
|
||||
|
||||
if (phy->type != e1000_phy_igp_3)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* Call gig speed drop workaround on LPLU before accessing
|
||||
* any PHY registers
|
||||
*/
|
||||
if ((hw->mac.type == e1000_ich8lan) &&
|
||||
(hw->phy.type == e1000_phy_igp_3))
|
||||
if (hw->mac.type == e1000_ich8lan)
|
||||
e1000e_gig_downshift_workaround_ich8lan(hw);
|
||||
|
||||
/* When LPLU is enabled, we should disable SmartSpeed */
|
||||
@@ -1905,7 +2036,7 @@ static s32 e1000_erase_flash_bank_ich8lan(struct e1000_hw *hw, u32 bank)
|
||||
break;
|
||||
case 1:
|
||||
sector_size = ICH_FLASH_SEG_SIZE_4K;
|
||||
iteration = flash_bank_size / ICH_FLASH_SEG_SIZE_4K;
|
||||
iteration = 1;
|
||||
break;
|
||||
case 2:
|
||||
if (hw->mac.type == e1000_ich9lan) {
|
||||
@@ -1917,7 +2048,7 @@ static s32 e1000_erase_flash_bank_ich8lan(struct e1000_hw *hw, u32 bank)
|
||||
break;
|
||||
case 3:
|
||||
sector_size = ICH_FLASH_SEG_SIZE_64K;
|
||||
iteration = flash_bank_size / ICH_FLASH_SEG_SIZE_64K;
|
||||
iteration = 1;
|
||||
break;
|
||||
default:
|
||||
return -E1000_ERR_NVM;
|
||||
@@ -2143,6 +2274,12 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
|
||||
ctrl = er32(CTRL);
|
||||
|
||||
if (!e1000_check_reset_block(hw)) {
|
||||
/* Clear PHY Reset Asserted bit */
|
||||
if (hw->mac.type >= e1000_pchlan) {
|
||||
u32 status = er32(STATUS);
|
||||
ew32(STATUS, status & ~E1000_STATUS_PHYRA);
|
||||
}
|
||||
|
||||
/*
|
||||
* PHY HW reset requires MAC CORE reset at the same
|
||||
* time to make sure the interface between MAC and the
|
||||
@@ -2156,22 +2293,33 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
|
||||
ew32(CTRL, (ctrl | E1000_CTRL_RST));
|
||||
msleep(20);
|
||||
|
||||
if (!ret_val) {
|
||||
/* release the swflag because it is not reset by
|
||||
* hardware reset
|
||||
*/
|
||||
if (!ret_val)
|
||||
e1000_release_swflag_ich8lan(hw);
|
||||
|
||||
if (ctrl & E1000_CTRL_PHY_RST)
|
||||
ret_val = hw->phy.ops.get_cfg_done(hw);
|
||||
|
||||
if (hw->mac.type >= e1000_ich10lan) {
|
||||
e1000_lan_init_done_ich8lan(hw);
|
||||
} else {
|
||||
ret_val = e1000e_get_auto_rd_done(hw);
|
||||
if (ret_val) {
|
||||
/*
|
||||
* When auto config read does not complete, do not
|
||||
* return with an error. This can happen in situations
|
||||
* where there is no eeprom and prevents getting link.
|
||||
*/
|
||||
hw_dbg(hw, "Auto Read Done did not complete\n");
|
||||
}
|
||||
}
|
||||
|
||||
ret_val = e1000e_get_auto_rd_done(hw);
|
||||
if (ret_val) {
|
||||
/*
|
||||
* When auto config read does not complete, do not
|
||||
* return with an error. This can happen in situations
|
||||
* where there is no eeprom and prevents getting link.
|
||||
*/
|
||||
hw_dbg(hw, "Auto Read Done did not complete\n");
|
||||
}
|
||||
/*
|
||||
* For PCH, this write will make sure that any noise
|
||||
* will be detected as a CRC error and be dropped rather than show up
|
||||
* as a bad packet to the DMA engine.
|
||||
*/
|
||||
if (hw->mac.type == e1000_pchlan)
|
||||
ew32(CRC_OFFSET, 0x65656565);
|
||||
|
||||
ew32(IMC, 0xffffffff);
|
||||
icr = er32(ICR);
|
||||
@@ -2222,6 +2370,18 @@ static s32 e1000_init_hw_ich8lan(struct e1000_hw *hw)
|
||||
for (i = 0; i < mac->mta_reg_count; i++)
|
||||
E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, 0);
|
||||
|
||||
/*
|
||||
* The 82578 Rx buffer will stall if wakeup is enabled in host and
|
||||
* the ME. Reading the BM_WUC register will clear the host wakeup bit.
|
||||
* Reset the phy after disabling host wakeup to reset the Rx buffer.
|
||||
*/
|
||||
if (hw->phy.type == e1000_phy_82578) {
|
||||
hw->phy.ops.read_phy_reg(hw, BM_WUC, &i);
|
||||
ret_val = e1000_phy_hw_reset_ich8lan(hw);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
/* Setup link and flow control */
|
||||
ret_val = e1000_setup_link_ich8lan(hw);
|
||||
|
||||
@@ -2253,16 +2413,6 @@ static s32 e1000_init_hw_ich8lan(struct e1000_hw *hw)
|
||||
ctrl_ext |= E1000_CTRL_EXT_RO_DIS;
|
||||
ew32(CTRL_EXT, ctrl_ext);
|
||||
|
||||
/*
|
||||
* The 82578 Rx buffer will stall if wakeup is enabled in host and
|
||||
* the ME. Reading the BM_WUC register will clear the host wakeup bit.
|
||||
* Reset the phy after disabling host wakeup to reset the Rx buffer.
|
||||
*/
|
||||
if (hw->phy.type == e1000_phy_82578) {
|
||||
e1e_rphy(hw, BM_WUC, &i);
|
||||
e1000e_phy_hw_reset_generic(hw);
|
||||
}
|
||||
|
||||
/*
|
||||
* Clear all of the statistics registers (clear on read). It is
|
||||
* important that we do this after we have tried to establish link
|
||||
@@ -2485,6 +2635,14 @@ static s32 e1000_get_link_up_info_ich8lan(struct e1000_hw *hw, u16 *speed,
|
||||
if (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) &&
|
||||
(hw->phy.type == e1000_phy_igp_3) &&
|
||||
(*speed == SPEED_1000)) {
|
||||
@@ -2850,6 +3008,16 @@ static s32 e1000_get_cfg_done_ich8lan(struct e1000_hw *hw)
|
||||
{
|
||||
u32 bank = 0;
|
||||
|
||||
if (hw->mac.type >= e1000_pchlan) {
|
||||
u32 status = er32(STATUS);
|
||||
|
||||
if (status & E1000_STATUS_PHYRA)
|
||||
ew32(STATUS, status & ~E1000_STATUS_PHYRA);
|
||||
else
|
||||
hw_dbg(hw,
|
||||
"PHY Reset Asserted not set - needs delay\n");
|
||||
}
|
||||
|
||||
e1000e_get_cfg_done(hw);
|
||||
|
||||
/* If EEPROM is not marked present, init the IGP 3 PHY manually */
|
||||
@@ -2921,7 +3089,7 @@ static void e1000_clear_hw_cntrs_ich8lan(struct e1000_hw *hw)
|
||||
static struct e1000_mac_operations ich8_mac_ops = {
|
||||
.id_led_init = e1000e_id_led_init,
|
||||
.check_mng_mode = e1000_check_mng_mode_ich8lan,
|
||||
.check_for_link = e1000e_check_for_copper_link,
|
||||
.check_for_link = e1000_check_for_copper_link_ich8lan,
|
||||
/* cleanup_led dependent on mac type */
|
||||
.clear_hw_cntrs = e1000_clear_hw_cntrs_ich8lan,
|
||||
.get_bus_info = e1000_get_bus_info_ich8lan,
|
||||
|
||||
@@ -378,12 +378,6 @@ s32 e1000e_check_for_copper_link(struct e1000_hw *hw)
|
||||
|
||||
mac->get_link_status = 0;
|
||||
|
||||
if (hw->phy.type == e1000_phy_82578) {
|
||||
ret_val = e1000_link_stall_workaround_hv(hw);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if there was DownShift, must be checked
|
||||
* immediately after link-up
|
||||
|
||||
@@ -1531,7 +1531,12 @@ s32 e1000e_phy_has_link_generic(struct e1000_hw *hw, u32 iterations,
|
||||
*/
|
||||
ret_val = e1e_rphy(hw, PHY_STATUS, &phy_status);
|
||||
if (ret_val)
|
||||
break;
|
||||
/*
|
||||
* If the first read fails, another entity may have
|
||||
* ownership of the resources, wait and try again to
|
||||
* see if they have relinquished the resources yet.
|
||||
*/
|
||||
udelay(usec_interval);
|
||||
ret_val = e1e_rphy(hw, PHY_STATUS, &phy_status);
|
||||
if (ret_val)
|
||||
break;
|
||||
@@ -2737,6 +2742,11 @@ s32 e1000_link_stall_workaround_hv(struct e1000_hw *hw)
|
||||
if (hw->phy.type != e1000_phy_82578)
|
||||
goto out;
|
||||
|
||||
/* Do not apply workaround if in PHY loopback bit 14 set */
|
||||
hw->phy.ops.read_phy_reg(hw, PHY_CONTROL, &data);
|
||||
if (data & PHY_CONTROL_LB)
|
||||
goto out;
|
||||
|
||||
/* check if link is up and at 1Gbps */
|
||||
ret_val = hw->phy.ops.read_phy_reg(hw, BM_CS_STATUS, &data);
|
||||
if (ret_val)
|
||||
|
||||
+14
-11
@@ -3514,11 +3514,13 @@ static irqreturn_t nv_nic_irq(int foo, void *data)
|
||||
nv_msi_workaround(np);
|
||||
|
||||
#ifdef CONFIG_FORCEDETH_NAPI
|
||||
napi_schedule(&np->napi);
|
||||
|
||||
/* Disable furthur irq's
|
||||
(msix not enabled with napi) */
|
||||
writel(0, base + NvRegIrqMask);
|
||||
if (napi_schedule_prep(&np->napi)) {
|
||||
/*
|
||||
* Disable further irq's (msix not enabled with napi)
|
||||
*/
|
||||
writel(0, base + NvRegIrqMask);
|
||||
__napi_schedule(&np->napi);
|
||||
}
|
||||
|
||||
#else
|
||||
do
|
||||
@@ -3615,12 +3617,13 @@ static irqreturn_t nv_nic_irq_optimized(int foo, void *data)
|
||||
nv_msi_workaround(np);
|
||||
|
||||
#ifdef CONFIG_FORCEDETH_NAPI
|
||||
napi_schedule(&np->napi);
|
||||
|
||||
/* Disable furthur irq's
|
||||
(msix not enabled with napi) */
|
||||
writel(0, base + NvRegIrqMask);
|
||||
|
||||
if (napi_schedule_prep(&np->napi)) {
|
||||
/*
|
||||
* Disable further irq's (msix not enabled with napi)
|
||||
*/
|
||||
writel(0, base + NvRegIrqMask);
|
||||
__napi_schedule(&np->napi);
|
||||
}
|
||||
#else
|
||||
do
|
||||
{
|
||||
|
||||
@@ -1830,7 +1830,6 @@ static int ixgbe_wol_exclusion(struct ixgbe_adapter *adapter,
|
||||
break;
|
||||
default:
|
||||
wol->supported = 0;
|
||||
retval = 0;
|
||||
}
|
||||
|
||||
return retval;
|
||||
|
||||
@@ -2697,19 +2697,23 @@ static int ixgbe_up_complete(struct ixgbe_adapter *adapter)
|
||||
|
||||
/*
|
||||
* For hot-pluggable SFP+ devices, a new SFP+ module may have
|
||||
* arrived before interrupts were enabled. We need to kick off
|
||||
* the SFP+ module setup first, then try to bring up link.
|
||||
* arrived before interrupts were enabled but after probe. Such
|
||||
* devices wouldn't have their type identified yet. We need to
|
||||
* kick off the SFP+ module setup first, then try to bring up link.
|
||||
* If we're not hot-pluggable SFP+, we just need to configure link
|
||||
* and bring it up.
|
||||
*/
|
||||
err = hw->phy.ops.identify(hw);
|
||||
if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
|
||||
dev_err(&adapter->pdev->dev, "failed to initialize because "
|
||||
"an unsupported SFP+ module type was detected.\n"
|
||||
"Reload the driver after installing a supported "
|
||||
"module.\n");
|
||||
ixgbe_down(adapter);
|
||||
return err;
|
||||
if (hw->phy.type == ixgbe_phy_unknown) {
|
||||
err = hw->phy.ops.identify(hw);
|
||||
if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
|
||||
/*
|
||||
* Take the device down and schedule the sfp tasklet
|
||||
* which will unregister_netdev and log it.
|
||||
*/
|
||||
ixgbe_down(adapter);
|
||||
schedule_work(&adapter->sfp_config_module_task);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
if (ixgbe_is_sfp(hw)) {
|
||||
@@ -3724,7 +3728,7 @@ static void ixgbe_sfp_task(struct work_struct *work)
|
||||
if ((hw->phy.type == ixgbe_phy_nl) &&
|
||||
(hw->phy.sfp_type == ixgbe_sfp_type_not_present)) {
|
||||
s32 ret = hw->phy.ops.identify_sfp(hw);
|
||||
if (ret)
|
||||
if (ret == IXGBE_ERR_SFP_NOT_PRESENT)
|
||||
goto reschedule;
|
||||
ret = hw->phy.ops.reset(hw);
|
||||
if (ret == IXGBE_ERR_SFP_NOT_SUPPORTED) {
|
||||
@@ -4534,13 +4538,17 @@ static void ixgbe_sfp_config_module_task(struct work_struct *work)
|
||||
u32 err;
|
||||
|
||||
adapter->flags |= IXGBE_FLAG_IN_SFP_MOD_TASK;
|
||||
|
||||
/* Time for electrical oscillations to settle down */
|
||||
msleep(100);
|
||||
err = hw->phy.ops.identify_sfp(hw);
|
||||
|
||||
if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
|
||||
dev_err(&adapter->pdev->dev, "failed to initialize because "
|
||||
"an unsupported SFP+ module type was detected.\n"
|
||||
"Reload the driver after installing a supported "
|
||||
"module.\n");
|
||||
ixgbe_down(adapter);
|
||||
unregister_netdev(adapter->netdev);
|
||||
return;
|
||||
}
|
||||
hw->mac.ops.setup_sfp(hw);
|
||||
|
||||
@@ -60,6 +60,7 @@ s32 ixgbe_identify_phy_generic(struct ixgbe_hw *hw)
|
||||
|
||||
if (hw->phy.type == ixgbe_phy_unknown) {
|
||||
for (phy_addr = 0; phy_addr < IXGBE_MAX_PHY_ADDR; phy_addr++) {
|
||||
hw->phy.mdio.prtad = phy_addr;
|
||||
if (mdio45_probe(&hw->phy.mdio, phy_addr) == 0) {
|
||||
ixgbe_get_phy_id(hw);
|
||||
hw->phy.type =
|
||||
@@ -68,6 +69,8 @@ s32 ixgbe_identify_phy_generic(struct ixgbe_hw *hw)
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* clear value if nothing found */
|
||||
hw->phy.mdio.prtad = 0;
|
||||
} else {
|
||||
status = 0;
|
||||
}
|
||||
|
||||
@@ -60,7 +60,18 @@
|
||||
#define _NETXEN_NIC_LINUX_SUBVERSION 30
|
||||
#define NETXEN_NIC_LINUX_VERSIONID "4.0.30"
|
||||
|
||||
#define NETXEN_VERSION_CODE(a, b, c) (((a) << 16) + ((b) << 8) + (c))
|
||||
#define NETXEN_VERSION_CODE(a, b, c) (((a) << 24) + ((b) << 16) + (c))
|
||||
#define _major(v) (((v) >> 24) & 0xff)
|
||||
#define _minor(v) (((v) >> 16) & 0xff)
|
||||
#define _build(v) ((v) & 0xffff)
|
||||
|
||||
/* version in image has weird encoding:
|
||||
* 7:0 - major
|
||||
* 15:8 - minor
|
||||
* 31:16 - build (little endian)
|
||||
*/
|
||||
#define NETXEN_DECODE_VERSION(v) \
|
||||
NETXEN_VERSION_CODE(((v) & 0xff), (((v) >> 8) & 0xff), ((v) >> 16))
|
||||
|
||||
#define NETXEN_NUM_FLASH_SECTORS (64)
|
||||
#define NETXEN_FLASH_SECTOR_SIZE (64 * 1024)
|
||||
@@ -614,6 +625,7 @@ struct netxen_new_user_info {
|
||||
#define NX_P2_MN_ROMIMAGE 0
|
||||
#define NX_P3_CT_ROMIMAGE 1
|
||||
#define NX_P3_MN_ROMIMAGE 2
|
||||
#define NX_FLASH_ROMIMAGE 3
|
||||
|
||||
#define NETXEN_USER_START_OLD NETXEN_PXE_START /* for backward compatibility */
|
||||
|
||||
@@ -1243,7 +1255,7 @@ struct netxen_adapter {
|
||||
u32 resv3;
|
||||
|
||||
u8 has_link_events;
|
||||
u8 resv1;
|
||||
u8 fw_type;
|
||||
u16 tx_context_id;
|
||||
u16 mtu;
|
||||
u16 is_up;
|
||||
@@ -1387,6 +1399,7 @@ void netxen_free_adapter_offload(struct netxen_adapter *adapter);
|
||||
int netxen_initialize_adapter_offload(struct netxen_adapter *adapter);
|
||||
int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val);
|
||||
int netxen_load_firmware(struct netxen_adapter *adapter);
|
||||
int netxen_need_fw_reset(struct netxen_adapter *adapter);
|
||||
void netxen_request_firmware(struct netxen_adapter *adapter);
|
||||
void netxen_release_firmware(struct netxen_adapter *adapter);
|
||||
int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose);
|
||||
|
||||
@@ -853,6 +853,7 @@ enum {
|
||||
#define NX_PEG_TUNE_CAPABILITY (NETXEN_CAM_RAM(0x02c))
|
||||
|
||||
#define NETXEN_CAM_RAM_DMA_WATCHDOG_CTRL (0x14)
|
||||
#define NETXEN_PEG_ALIVE_COUNTER (NETXEN_CAM_RAM(0xb0))
|
||||
|
||||
#define ISR_MSI_INT_TRIGGER(FUNC) (NETXEN_PCIX_PS_REG(PCIX_MSI_F(FUNC)))
|
||||
#define ISR_LEGACY_INT_TRIGGERED(VAL) (((VAL) & 0x300) == 0x200)
|
||||
|
||||
@@ -683,12 +683,85 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
netxen_need_fw_reset(struct netxen_adapter *adapter)
|
||||
{
|
||||
u32 count, old_count;
|
||||
u32 val, version, major, minor, build;
|
||||
int i, timeout;
|
||||
u8 fw_type;
|
||||
|
||||
/* NX2031 firmware doesn't support heartbit */
|
||||
if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
|
||||
return 1;
|
||||
|
||||
/* last attempt had failed */
|
||||
if (NXRD32(adapter, CRB_CMDPEG_STATE) == PHAN_INITIALIZE_FAILED)
|
||||
return 1;
|
||||
|
||||
old_count = count = NXRD32(adapter, NETXEN_PEG_ALIVE_COUNTER);
|
||||
|
||||
for (i = 0; i < 10; i++) {
|
||||
|
||||
timeout = msleep_interruptible(200);
|
||||
if (timeout) {
|
||||
NXWR32(adapter, CRB_CMDPEG_STATE,
|
||||
PHAN_INITIALIZE_FAILED);
|
||||
return -EINTR;
|
||||
}
|
||||
|
||||
count = NXRD32(adapter, NETXEN_PEG_ALIVE_COUNTER);
|
||||
if (count != old_count)
|
||||
break;
|
||||
}
|
||||
|
||||
/* firmware is dead */
|
||||
if (count == old_count)
|
||||
return 1;
|
||||
|
||||
/* check if we have got newer or different file firmware */
|
||||
if (adapter->fw) {
|
||||
|
||||
const struct firmware *fw = adapter->fw;
|
||||
|
||||
val = cpu_to_le32(*(u32 *)&fw->data[NX_FW_VERSION_OFFSET]);
|
||||
version = NETXEN_DECODE_VERSION(val);
|
||||
|
||||
major = NXRD32(adapter, NETXEN_FW_VERSION_MAJOR);
|
||||
minor = NXRD32(adapter, NETXEN_FW_VERSION_MINOR);
|
||||
build = NXRD32(adapter, NETXEN_FW_VERSION_SUB);
|
||||
|
||||
if (version > NETXEN_VERSION_CODE(major, minor, build))
|
||||
return 1;
|
||||
|
||||
if (version == NETXEN_VERSION_CODE(major, minor, build)) {
|
||||
|
||||
val = NXRD32(adapter, NETXEN_MIU_MN_CONTROL);
|
||||
fw_type = (val & 0x4) ?
|
||||
NX_P3_CT_ROMIMAGE : NX_P3_MN_ROMIMAGE;
|
||||
|
||||
if (adapter->fw_type != fw_type)
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static char *fw_name[] = {
|
||||
"nxromimg.bin", "nx3fwct.bin", "nx3fwmn.bin", "flash",
|
||||
};
|
||||
|
||||
int
|
||||
netxen_load_firmware(struct netxen_adapter *adapter)
|
||||
{
|
||||
u64 *ptr64;
|
||||
u32 i, flashaddr, size;
|
||||
const struct firmware *fw = adapter->fw;
|
||||
struct pci_dev *pdev = adapter->pdev;
|
||||
|
||||
dev_info(&pdev->dev, "loading firmware from %s\n",
|
||||
fw_name[adapter->fw_type]);
|
||||
|
||||
if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
|
||||
NXWR32(adapter, NETXEN_ROMUSB_GLB_CAS_RST, 1);
|
||||
@@ -756,7 +829,7 @@ static int
|
||||
netxen_validate_firmware(struct netxen_adapter *adapter, const char *fwname)
|
||||
{
|
||||
__le32 val;
|
||||
u32 major, minor, build, ver, min_ver, bios;
|
||||
u32 ver, min_ver, bios;
|
||||
struct pci_dev *pdev = adapter->pdev;
|
||||
const struct firmware *fw = adapter->fw;
|
||||
|
||||
@@ -768,21 +841,18 @@ netxen_validate_firmware(struct netxen_adapter *adapter, const char *fwname)
|
||||
return -EINVAL;
|
||||
|
||||
val = cpu_to_le32(*(u32 *)&fw->data[NX_FW_VERSION_OFFSET]);
|
||||
major = (__force u32)val & 0xff;
|
||||
minor = ((__force u32)val >> 8) & 0xff;
|
||||
build = (__force u32)val >> 16;
|
||||
|
||||
if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
|
||||
min_ver = NETXEN_VERSION_CODE(4, 0, 216);
|
||||
else
|
||||
min_ver = NETXEN_VERSION_CODE(3, 4, 216);
|
||||
|
||||
ver = NETXEN_VERSION_CODE(major, minor, build);
|
||||
ver = NETXEN_DECODE_VERSION(val);
|
||||
|
||||
if ((major > _NETXEN_NIC_LINUX_MAJOR) || (ver < min_ver)) {
|
||||
if ((_major(ver) > _NETXEN_NIC_LINUX_MAJOR) || (ver < min_ver)) {
|
||||
dev_err(&pdev->dev,
|
||||
"%s: firmware version %d.%d.%d unsupported\n",
|
||||
fwname, major, minor, build);
|
||||
fwname, _major(ver), _minor(ver), _build(ver));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -798,22 +868,21 @@ netxen_validate_firmware(struct netxen_adapter *adapter, const char *fwname)
|
||||
if (netxen_rom_fast_read(adapter,
|
||||
NX_FW_VERSION_OFFSET, (int *)&val))
|
||||
return -EIO;
|
||||
major = (__force u32)val & 0xff;
|
||||
minor = ((__force u32)val >> 8) & 0xff;
|
||||
build = (__force u32)val >> 16;
|
||||
if (NETXEN_VERSION_CODE(major, minor, build) > ver)
|
||||
val = NETXEN_DECODE_VERSION(val);
|
||||
if (val > ver) {
|
||||
dev_info(&pdev->dev, "%s: firmware is older than flash\n",
|
||||
fwname);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
NXWR32(adapter, NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static char *fw_name[] = { "nxromimg.bin", "nx3fwct.bin", "nx3fwmn.bin" };
|
||||
|
||||
void netxen_request_firmware(struct netxen_adapter *adapter)
|
||||
{
|
||||
u32 capability, flashed_ver;
|
||||
int fw_type;
|
||||
u8 fw_type;
|
||||
struct pci_dev *pdev = adapter->pdev;
|
||||
int rc = 0;
|
||||
|
||||
@@ -830,6 +899,8 @@ request_mn:
|
||||
|
||||
netxen_rom_fast_read(adapter,
|
||||
NX_FW_VERSION_OFFSET, (int *)&flashed_ver);
|
||||
flashed_ver = NETXEN_DECODE_VERSION(flashed_ver);
|
||||
|
||||
if (flashed_ver >= NETXEN_VERSION_CODE(4, 0, 220)) {
|
||||
capability = NXRD32(adapter, NX_PEG_TUNE_CAPABILITY);
|
||||
if (capability & NX_PEG_TUNE_MN_PRESENT) {
|
||||
@@ -838,6 +909,10 @@ request_mn:
|
||||
}
|
||||
}
|
||||
|
||||
fw_type = NX_FLASH_ROMIMAGE;
|
||||
adapter->fw = NULL;
|
||||
goto done;
|
||||
|
||||
request_fw:
|
||||
rc = request_firmware(&adapter->fw, fw_name[fw_type], &pdev->dev);
|
||||
if (rc != 0) {
|
||||
@@ -846,6 +921,7 @@ request_fw:
|
||||
goto request_mn;
|
||||
}
|
||||
|
||||
fw_type = NX_FLASH_ROMIMAGE;
|
||||
adapter->fw = NULL;
|
||||
goto done;
|
||||
}
|
||||
@@ -859,16 +935,13 @@ request_fw:
|
||||
goto request_mn;
|
||||
}
|
||||
|
||||
fw_type = NX_FLASH_ROMIMAGE;
|
||||
adapter->fw = NULL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
done:
|
||||
if (adapter->fw)
|
||||
dev_info(&pdev->dev, "loading firmware from file %s\n",
|
||||
fw_name[fw_type]);
|
||||
else
|
||||
dev_info(&pdev->dev, "loading firmware from flash\n");
|
||||
adapter->fw_type = fw_type;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -718,6 +718,10 @@ netxen_start_firmware(struct netxen_adapter *adapter, int request_fw)
|
||||
if (request_fw)
|
||||
netxen_request_firmware(adapter);
|
||||
|
||||
err = netxen_need_fw_reset(adapter);
|
||||
if (err <= 0)
|
||||
return err;
|
||||
|
||||
if (first_boot != 0x55555555) {
|
||||
NXWR32(adapter, CRB_CMDPEG_STATE, 0);
|
||||
netxen_pinit_from_rom(adapter, 0);
|
||||
|
||||
@@ -1727,6 +1727,7 @@ static struct pcmcia_device_id pcnet_ids[] = {
|
||||
PCMCIA_DEVICE_PROD_ID12("PRETEC", "Ethernet CompactLAN 10BaseT 3.3V", 0xebf91155, 0x7f5a4f50),
|
||||
PCMCIA_DEVICE_PROD_ID12("Psion Dacom", "Gold Card Ethernet", 0xf5f025c2, 0x3a30e110),
|
||||
PCMCIA_DEVICE_PROD_ID12("=RELIA==", "Ethernet", 0xcdd0644a, 0x00b2e941),
|
||||
PCMCIA_DEVICE_PROD_ID12("RIOS Systems Co.", "PC CARD3 ETHERNET", 0x7dd33481, 0x10b41826),
|
||||
PCMCIA_DEVICE_PROD_ID12("RP", "1625B Ethernet NE2000 Compatible", 0xe3e66e22, 0xb96150df),
|
||||
PCMCIA_DEVICE_PROD_ID12("RPTI", "EP400 Ethernet NE2000 Compatible", 0xdc6f88fd, 0x4a7e2ae0),
|
||||
PCMCIA_DEVICE_PROD_ID12("RPTI", "EP401 Ethernet NE2000 Compatible", 0xdc6f88fd, 0x4bcbd7fd),
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user