Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Merge net into net-next to setup some infrastructure Eric Dumazet needs for usbnet changes. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -1419,8 +1419,8 @@ void qlcnic_pci_camqm_write_2M(struct qlcnic_adapter *, u64, u64);
|
||||
#define ADDR_IN_RANGE(addr, low, high) \
|
||||
(((addr) < (high)) && ((addr) >= (low)))
|
||||
|
||||
#define QLCRD32(adapter, off) \
|
||||
(adapter->ahw->hw_ops->read_reg)(adapter, off)
|
||||
#define QLCRD32(adapter, off, err) \
|
||||
(adapter->ahw->hw_ops->read_reg)(adapter, off, err)
|
||||
|
||||
#define QLCWR32(adapter, off, val) \
|
||||
adapter->ahw->hw_ops->write_reg(adapter, off, val)
|
||||
@@ -1637,7 +1637,7 @@ void qlcnic_83xx_free_mailbox(struct qlcnic_mailbox *mbx);
|
||||
struct qlcnic_hardware_ops {
|
||||
void (*read_crb) (struct qlcnic_adapter *, char *, loff_t, size_t);
|
||||
void (*write_crb) (struct qlcnic_adapter *, char *, loff_t, size_t);
|
||||
int (*read_reg) (struct qlcnic_adapter *, ulong);
|
||||
int (*read_reg) (struct qlcnic_adapter *, ulong, int *);
|
||||
int (*write_reg) (struct qlcnic_adapter *, ulong, u32);
|
||||
void (*get_ocm_win) (struct qlcnic_hardware_context *);
|
||||
int (*get_mac_address) (struct qlcnic_adapter *, u8 *);
|
||||
@@ -1695,12 +1695,6 @@ static inline void qlcnic_write_crb(struct qlcnic_adapter *adapter, char *buf,
|
||||
adapter->ahw->hw_ops->write_crb(adapter, buf, offset, size);
|
||||
}
|
||||
|
||||
static inline int qlcnic_hw_read_wx_2M(struct qlcnic_adapter *adapter,
|
||||
ulong off)
|
||||
{
|
||||
return adapter->ahw->hw_ops->read_reg(adapter, off);
|
||||
}
|
||||
|
||||
static inline int qlcnic_hw_write_wx_2M(struct qlcnic_adapter *adapter,
|
||||
ulong off, u32 data)
|
||||
{
|
||||
@@ -1902,7 +1896,8 @@ static inline void qlcnic_free_mac_list(struct qlcnic_adapter *adapter)
|
||||
|
||||
static inline void qlcnic_set_mac_filter_count(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
adapter->ahw->hw_ops->set_mac_filter_count(adapter);
|
||||
if (adapter->ahw->hw_ops->set_mac_filter_count)
|
||||
adapter->ahw->hw_ops->set_mac_filter_count(adapter);
|
||||
}
|
||||
|
||||
static inline void qlcnic_dev_request_reset(struct qlcnic_adapter *adapter,
|
||||
|
@@ -228,17 +228,17 @@ static int __qlcnic_set_win_base(struct qlcnic_adapter *adapter, u32 addr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *adapter, ulong addr)
|
||||
int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *adapter, ulong addr,
|
||||
int *err)
|
||||
{
|
||||
int ret;
|
||||
struct qlcnic_hardware_context *ahw = adapter->ahw;
|
||||
|
||||
ret = __qlcnic_set_win_base(adapter, (u32) addr);
|
||||
if (!ret) {
|
||||
*err = __qlcnic_set_win_base(adapter, (u32) addr);
|
||||
if (!*err) {
|
||||
return QLCRDX(ahw, QLCNIC_WILDCARD);
|
||||
} else {
|
||||
dev_err(&adapter->pdev->dev,
|
||||
"%s failed, addr = 0x%x\n", __func__, (int)addr);
|
||||
"%s failed, addr = 0x%lx\n", __func__, addr);
|
||||
return -EIO;
|
||||
}
|
||||
}
|
||||
@@ -574,7 +574,7 @@ void qlcnic_83xx_cam_unlock(struct qlcnic_adapter *adapter)
|
||||
void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf,
|
||||
loff_t offset, size_t size)
|
||||
{
|
||||
int ret;
|
||||
int ret = 0;
|
||||
u32 data;
|
||||
|
||||
if (qlcnic_api_lock(adapter)) {
|
||||
@@ -584,7 +584,7 @@ void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf,
|
||||
return;
|
||||
}
|
||||
|
||||
ret = qlcnic_83xx_rd_reg_indirect(adapter, (u32) offset);
|
||||
data = QLCRD32(adapter, (u32) offset, &ret);
|
||||
qlcnic_api_unlock(adapter);
|
||||
|
||||
if (ret == -EIO) {
|
||||
@@ -593,7 +593,6 @@ void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf,
|
||||
__func__, (u32)offset);
|
||||
return;
|
||||
}
|
||||
data = ret;
|
||||
memcpy(buf, &data, size);
|
||||
}
|
||||
|
||||
@@ -2077,18 +2076,25 @@ void qlcnic_83xx_config_intr_coal(struct qlcnic_adapter *adapter)
|
||||
static void qlcnic_83xx_handle_link_aen(struct qlcnic_adapter *adapter,
|
||||
u32 data[])
|
||||
{
|
||||
struct qlcnic_hardware_context *ahw = adapter->ahw;
|
||||
u8 link_status, duplex;
|
||||
/* link speed */
|
||||
link_status = LSB(data[3]) & 1;
|
||||
adapter->ahw->link_speed = MSW(data[2]);
|
||||
adapter->ahw->link_autoneg = MSB(MSW(data[3]));
|
||||
adapter->ahw->module_type = MSB(LSW(data[3]));
|
||||
duplex = LSB(MSW(data[3]));
|
||||
if (duplex)
|
||||
adapter->ahw->link_duplex = DUPLEX_FULL;
|
||||
else
|
||||
adapter->ahw->link_duplex = DUPLEX_HALF;
|
||||
adapter->ahw->has_link_events = 1;
|
||||
if (link_status) {
|
||||
ahw->link_speed = MSW(data[2]);
|
||||
duplex = LSB(MSW(data[3]));
|
||||
if (duplex)
|
||||
ahw->link_duplex = DUPLEX_FULL;
|
||||
else
|
||||
ahw->link_duplex = DUPLEX_HALF;
|
||||
} else {
|
||||
ahw->link_speed = SPEED_UNKNOWN;
|
||||
ahw->link_duplex = DUPLEX_UNKNOWN;
|
||||
}
|
||||
|
||||
ahw->link_autoneg = MSB(MSW(data[3]));
|
||||
ahw->module_type = MSB(LSW(data[3]));
|
||||
ahw->has_link_events = 1;
|
||||
qlcnic_advert_link_change(adapter, link_status);
|
||||
}
|
||||
|
||||
@@ -2390,9 +2396,9 @@ int qlcnic_83xx_lockless_flash_read32(struct qlcnic_adapter *adapter,
|
||||
u32 flash_addr, u8 *p_data,
|
||||
int count)
|
||||
{
|
||||
int i, ret;
|
||||
u32 word, range, flash_offset, addr = flash_addr;
|
||||
u32 word, range, flash_offset, addr = flash_addr, ret;
|
||||
ulong indirect_add, direct_window;
|
||||
int i, err = 0;
|
||||
|
||||
flash_offset = addr & (QLCNIC_FLASH_SECTOR_SIZE - 1);
|
||||
if (addr & 0x3) {
|
||||
@@ -2410,10 +2416,9 @@ int qlcnic_83xx_lockless_flash_read32(struct qlcnic_adapter *adapter,
|
||||
/* Multi sector read */
|
||||
for (i = 0; i < count; i++) {
|
||||
indirect_add = QLC_83XX_FLASH_DIRECT_DATA(addr);
|
||||
ret = qlcnic_83xx_rd_reg_indirect(adapter,
|
||||
indirect_add);
|
||||
if (ret == -EIO)
|
||||
return -EIO;
|
||||
ret = QLCRD32(adapter, indirect_add, &err);
|
||||
if (err == -EIO)
|
||||
return err;
|
||||
|
||||
word = ret;
|
||||
*(u32 *)p_data = word;
|
||||
@@ -2434,10 +2439,9 @@ int qlcnic_83xx_lockless_flash_read32(struct qlcnic_adapter *adapter,
|
||||
/* Single sector read */
|
||||
for (i = 0; i < count; i++) {
|
||||
indirect_add = QLC_83XX_FLASH_DIRECT_DATA(addr);
|
||||
ret = qlcnic_83xx_rd_reg_indirect(adapter,
|
||||
indirect_add);
|
||||
if (ret == -EIO)
|
||||
return -EIO;
|
||||
ret = QLCRD32(adapter, indirect_add, &err);
|
||||
if (err == -EIO)
|
||||
return err;
|
||||
|
||||
word = ret;
|
||||
*(u32 *)p_data = word;
|
||||
@@ -2453,10 +2457,13 @@ static int qlcnic_83xx_poll_flash_status_reg(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
u32 status;
|
||||
int retries = QLC_83XX_FLASH_READ_RETRY_COUNT;
|
||||
int err = 0;
|
||||
|
||||
do {
|
||||
status = qlcnic_83xx_rd_reg_indirect(adapter,
|
||||
QLC_83XX_FLASH_STATUS);
|
||||
status = QLCRD32(adapter, QLC_83XX_FLASH_STATUS, &err);
|
||||
if (err == -EIO)
|
||||
return err;
|
||||
|
||||
if ((status & QLC_83XX_FLASH_STATUS_READY) ==
|
||||
QLC_83XX_FLASH_STATUS_READY)
|
||||
break;
|
||||
@@ -2508,7 +2515,8 @@ int qlcnic_83xx_disable_flash_write(struct qlcnic_adapter *adapter)
|
||||
|
||||
int qlcnic_83xx_read_flash_mfg_id(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
int ret, mfg_id;
|
||||
int ret, err = 0;
|
||||
u32 mfg_id;
|
||||
|
||||
if (qlcnic_83xx_lock_flash(adapter))
|
||||
return -EIO;
|
||||
@@ -2523,9 +2531,11 @@ int qlcnic_83xx_read_flash_mfg_id(struct qlcnic_adapter *adapter)
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
mfg_id = qlcnic_83xx_rd_reg_indirect(adapter, QLC_83XX_FLASH_RDDATA);
|
||||
if (mfg_id == -EIO)
|
||||
return -EIO;
|
||||
mfg_id = QLCRD32(adapter, QLC_83XX_FLASH_RDDATA, &err);
|
||||
if (err == -EIO) {
|
||||
qlcnic_83xx_unlock_flash(adapter);
|
||||
return err;
|
||||
}
|
||||
|
||||
adapter->flash_mfg_id = (mfg_id & 0xFF);
|
||||
qlcnic_83xx_unlock_flash(adapter);
|
||||
@@ -2642,7 +2652,7 @@ int qlcnic_83xx_flash_bulk_write(struct qlcnic_adapter *adapter, u32 addr,
|
||||
u32 *p_data, int count)
|
||||
{
|
||||
u32 temp;
|
||||
int ret = -EIO;
|
||||
int ret = -EIO, err = 0;
|
||||
|
||||
if ((count < QLC_83XX_FLASH_WRITE_MIN) ||
|
||||
(count > QLC_83XX_FLASH_WRITE_MAX)) {
|
||||
@@ -2651,8 +2661,10 @@ int qlcnic_83xx_flash_bulk_write(struct qlcnic_adapter *adapter, u32 addr,
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
temp = qlcnic_83xx_rd_reg_indirect(adapter,
|
||||
QLC_83XX_FLASH_SPI_CONTROL);
|
||||
temp = QLCRD32(adapter, QLC_83XX_FLASH_SPI_CONTROL, &err);
|
||||
if (err == -EIO)
|
||||
return err;
|
||||
|
||||
qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_SPI_CONTROL,
|
||||
(temp | QLC_83XX_FLASH_SPI_CTRL));
|
||||
qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR,
|
||||
@@ -2701,13 +2713,18 @@ int qlcnic_83xx_flash_bulk_write(struct qlcnic_adapter *adapter, u32 addr,
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
ret = qlcnic_83xx_rd_reg_indirect(adapter, QLC_83XX_FLASH_SPI_STATUS);
|
||||
ret = QLCRD32(adapter, QLC_83XX_FLASH_SPI_STATUS, &err);
|
||||
if (err == -EIO)
|
||||
return err;
|
||||
|
||||
if ((ret & QLC_83XX_FLASH_SPI_CTRL) == QLC_83XX_FLASH_SPI_CTRL) {
|
||||
dev_err(&adapter->pdev->dev, "%s: failed at %d\n",
|
||||
__func__, __LINE__);
|
||||
/* Operation failed, clear error bit */
|
||||
temp = qlcnic_83xx_rd_reg_indirect(adapter,
|
||||
QLC_83XX_FLASH_SPI_CONTROL);
|
||||
temp = QLCRD32(adapter, QLC_83XX_FLASH_SPI_CONTROL, &err);
|
||||
if (err == -EIO)
|
||||
return err;
|
||||
|
||||
qlcnic_83xx_wrt_reg_indirect(adapter,
|
||||
QLC_83XX_FLASH_SPI_CONTROL,
|
||||
(temp | QLC_83XX_FLASH_SPI_CTRL));
|
||||
@@ -2829,6 +2846,7 @@ int qlcnic_83xx_ms_mem_write128(struct qlcnic_adapter *adapter, u64 addr,
|
||||
{
|
||||
int i, j, ret = 0;
|
||||
u32 temp;
|
||||
int err = 0;
|
||||
|
||||
/* Check alignment */
|
||||
if (addr & 0xF)
|
||||
@@ -2861,8 +2879,12 @@ int qlcnic_83xx_ms_mem_write128(struct qlcnic_adapter *adapter, u64 addr,
|
||||
QLCNIC_TA_WRITE_START);
|
||||
|
||||
for (j = 0; j < MAX_CTL_CHECK; j++) {
|
||||
temp = qlcnic_83xx_rd_reg_indirect(adapter,
|
||||
QLCNIC_MS_CTRL);
|
||||
temp = QLCRD32(adapter, QLCNIC_MS_CTRL, &err);
|
||||
if (err == -EIO) {
|
||||
mutex_unlock(&adapter->ahw->mem_lock);
|
||||
return err;
|
||||
}
|
||||
|
||||
if ((temp & TA_CTL_BUSY) == 0)
|
||||
break;
|
||||
}
|
||||
@@ -2884,9 +2906,9 @@ int qlcnic_83xx_ms_mem_write128(struct qlcnic_adapter *adapter, u64 addr,
|
||||
int qlcnic_83xx_flash_read32(struct qlcnic_adapter *adapter, u32 flash_addr,
|
||||
u8 *p_data, int count)
|
||||
{
|
||||
int i, ret;
|
||||
u32 word, addr = flash_addr;
|
||||
u32 word, addr = flash_addr, ret;
|
||||
ulong indirect_addr;
|
||||
int i, err = 0;
|
||||
|
||||
if (qlcnic_83xx_lock_flash(adapter) != 0)
|
||||
return -EIO;
|
||||
@@ -2906,10 +2928,10 @@ int qlcnic_83xx_flash_read32(struct qlcnic_adapter *adapter, u32 flash_addr,
|
||||
}
|
||||
|
||||
indirect_addr = QLC_83XX_FLASH_DIRECT_DATA(addr);
|
||||
ret = qlcnic_83xx_rd_reg_indirect(adapter,
|
||||
indirect_addr);
|
||||
if (ret == -EIO)
|
||||
return -EIO;
|
||||
ret = QLCRD32(adapter, indirect_addr, &err);
|
||||
if (err == -EIO)
|
||||
return err;
|
||||
|
||||
word = ret;
|
||||
*(u32 *)p_data = word;
|
||||
p_data = p_data + 4;
|
||||
@@ -3020,8 +3042,8 @@ int qlcnic_83xx_get_settings(struct qlcnic_adapter *adapter,
|
||||
}
|
||||
|
||||
if (ahw->port_type == QLCNIC_XGBE) {
|
||||
ecmd->supported = SUPPORTED_1000baseT_Full;
|
||||
ecmd->advertising = ADVERTISED_1000baseT_Full;
|
||||
ecmd->supported = SUPPORTED_10000baseT_Full;
|
||||
ecmd->advertising = ADVERTISED_10000baseT_Full;
|
||||
} else {
|
||||
ecmd->supported = (SUPPORTED_10baseT_Half |
|
||||
SUPPORTED_10baseT_Full |
|
||||
@@ -3375,7 +3397,8 @@ int qlcnic_83xx_set_pauseparam(struct qlcnic_adapter *adapter,
|
||||
|
||||
static int qlcnic_83xx_read_flash_status_reg(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
int ret;
|
||||
int ret, err = 0;
|
||||
u32 temp;
|
||||
|
||||
qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR,
|
||||
QLC_83XX_FLASH_OEM_READ_SIG);
|
||||
@@ -3385,8 +3408,11 @@ static int qlcnic_83xx_read_flash_status_reg(struct qlcnic_adapter *adapter)
|
||||
if (ret)
|
||||
return -EIO;
|
||||
|
||||
ret = qlcnic_83xx_rd_reg_indirect(adapter, QLC_83XX_FLASH_RDDATA);
|
||||
return ret & 0xFF;
|
||||
temp = QLCRD32(adapter, QLC_83XX_FLASH_RDDATA, &err);
|
||||
if (err == -EIO)
|
||||
return err;
|
||||
|
||||
return temp & 0xFF;
|
||||
}
|
||||
|
||||
int qlcnic_83xx_flash_test(struct qlcnic_adapter *adapter)
|
||||
|
@@ -529,7 +529,7 @@ void qlcnic_83xx_add_sysfs(struct qlcnic_adapter *);
|
||||
void qlcnic_83xx_remove_sysfs(struct qlcnic_adapter *);
|
||||
void qlcnic_83xx_write_crb(struct qlcnic_adapter *, char *, loff_t, size_t);
|
||||
void qlcnic_83xx_read_crb(struct qlcnic_adapter *, char *, loff_t, size_t);
|
||||
int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *, ulong);
|
||||
int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *, ulong, int *);
|
||||
int qlcnic_83xx_wrt_reg_indirect(struct qlcnic_adapter *, ulong, u32);
|
||||
void qlcnic_83xx_process_rcv_diag(struct qlcnic_adapter *, int, u64 []);
|
||||
int qlcnic_83xx_nic_set_promisc(struct qlcnic_adapter *, u32);
|
||||
|
@@ -1312,8 +1312,11 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
int i, j;
|
||||
u32 val = 0, val1 = 0, reg = 0;
|
||||
int err = 0;
|
||||
|
||||
val = QLCRD32(adapter, QLC_83XX_SRE_SHIM_REG);
|
||||
val = QLCRD32(adapter, QLC_83XX_SRE_SHIM_REG, &err);
|
||||
if (err == -EIO)
|
||||
return;
|
||||
dev_info(&adapter->pdev->dev, "SRE-Shim Ctrl:0x%x\n", val);
|
||||
|
||||
for (j = 0; j < 2; j++) {
|
||||
@@ -1327,7 +1330,9 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter)
|
||||
reg = QLC_83XX_PORT1_THRESHOLD;
|
||||
}
|
||||
for (i = 0; i < 8; i++) {
|
||||
val = QLCRD32(adapter, reg + (i * 0x4));
|
||||
val = QLCRD32(adapter, reg + (i * 0x4), &err);
|
||||
if (err == -EIO)
|
||||
return;
|
||||
dev_info(&adapter->pdev->dev, "0x%x ", val);
|
||||
}
|
||||
dev_info(&adapter->pdev->dev, "\n");
|
||||
@@ -1344,8 +1349,10 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter)
|
||||
reg = QLC_83XX_PORT1_TC_MC_REG;
|
||||
}
|
||||
for (i = 0; i < 4; i++) {
|
||||
val = QLCRD32(adapter, reg + (i * 0x4));
|
||||
dev_info(&adapter->pdev->dev, "0x%x ", val);
|
||||
val = QLCRD32(adapter, reg + (i * 0x4), &err);
|
||||
if (err == -EIO)
|
||||
return;
|
||||
dev_info(&adapter->pdev->dev, "0x%x ", val);
|
||||
}
|
||||
dev_info(&adapter->pdev->dev, "\n");
|
||||
}
|
||||
@@ -1361,17 +1368,25 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter)
|
||||
reg = QLC_83XX_PORT1_TC_STATS;
|
||||
}
|
||||
for (i = 7; i >= 0; i--) {
|
||||
val = QLCRD32(adapter, reg);
|
||||
val = QLCRD32(adapter, reg, &err);
|
||||
if (err == -EIO)
|
||||
return;
|
||||
val &= ~(0x7 << 29); /* Reset bits 29 to 31 */
|
||||
QLCWR32(adapter, reg, (val | (i << 29)));
|
||||
val = QLCRD32(adapter, reg);
|
||||
val = QLCRD32(adapter, reg, &err);
|
||||
if (err == -EIO)
|
||||
return;
|
||||
dev_info(&adapter->pdev->dev, "0x%x ", val);
|
||||
}
|
||||
dev_info(&adapter->pdev->dev, "\n");
|
||||
}
|
||||
|
||||
val = QLCRD32(adapter, QLC_83XX_PORT2_IFB_THRESHOLD);
|
||||
val1 = QLCRD32(adapter, QLC_83XX_PORT3_IFB_THRESHOLD);
|
||||
val = QLCRD32(adapter, QLC_83XX_PORT2_IFB_THRESHOLD, &err);
|
||||
if (err == -EIO)
|
||||
return;
|
||||
val1 = QLCRD32(adapter, QLC_83XX_PORT3_IFB_THRESHOLD, &err);
|
||||
if (err == -EIO)
|
||||
return;
|
||||
dev_info(&adapter->pdev->dev,
|
||||
"IFB-Pause Thresholds: Port 2:0x%x, Port 3:0x%x\n",
|
||||
val, val1);
|
||||
@@ -1434,7 +1449,7 @@ static void qlcnic_83xx_take_eport_out_of_reset(struct qlcnic_adapter *adapter)
|
||||
static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev)
|
||||
{
|
||||
u32 heartbeat, peg_status;
|
||||
int retries, ret = -EIO;
|
||||
int retries, ret = -EIO, err = 0;
|
||||
|
||||
retries = QLCNIC_HEARTBEAT_CHECK_RETRY_COUNT;
|
||||
p_dev->heartbeat = QLC_SHARED_REG_RD32(p_dev,
|
||||
@@ -1462,11 +1477,11 @@ static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev)
|
||||
"PEG_NET_2_PC: 0x%x, PEG_NET_3_PC: 0x%x,\n"
|
||||
"PEG_NET_4_PC: 0x%x\n", peg_status,
|
||||
QLC_SHARED_REG_RD32(p_dev, QLCNIC_PEG_HALT_STATUS2),
|
||||
QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_0),
|
||||
QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_1),
|
||||
QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_2),
|
||||
QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_3),
|
||||
QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_4));
|
||||
QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_0, &err),
|
||||
QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_1, &err),
|
||||
QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_2, &err),
|
||||
QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_3, &err),
|
||||
QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_4, &err));
|
||||
|
||||
if (QLCNIC_FWERROR_CODE(peg_status) == 0x67)
|
||||
dev_err(&p_dev->pdev->dev,
|
||||
@@ -1510,18 +1525,22 @@ int qlcnic_83xx_check_hw_status(struct qlcnic_adapter *p_dev)
|
||||
static int qlcnic_83xx_poll_reg(struct qlcnic_adapter *p_dev, u32 addr,
|
||||
int duration, u32 mask, u32 status)
|
||||
{
|
||||
int timeout_error, err = 0;
|
||||
u32 value;
|
||||
int timeout_error;
|
||||
u8 retries;
|
||||
|
||||
value = qlcnic_83xx_rd_reg_indirect(p_dev, addr);
|
||||
value = QLCRD32(p_dev, addr, &err);
|
||||
if (err == -EIO)
|
||||
return err;
|
||||
retries = duration / 10;
|
||||
|
||||
do {
|
||||
if ((value & mask) != status) {
|
||||
timeout_error = 1;
|
||||
msleep(duration / 10);
|
||||
value = qlcnic_83xx_rd_reg_indirect(p_dev, addr);
|
||||
value = QLCRD32(p_dev, addr, &err);
|
||||
if (err == -EIO)
|
||||
return err;
|
||||
} else {
|
||||
timeout_error = 0;
|
||||
break;
|
||||
@@ -1615,9 +1634,12 @@ int qlcnic_83xx_get_reset_instruction_template(struct qlcnic_adapter *p_dev)
|
||||
static void qlcnic_83xx_read_write_crb_reg(struct qlcnic_adapter *p_dev,
|
||||
u32 raddr, u32 waddr)
|
||||
{
|
||||
int value;
|
||||
int err = 0;
|
||||
u32 value;
|
||||
|
||||
value = qlcnic_83xx_rd_reg_indirect(p_dev, raddr);
|
||||
value = QLCRD32(p_dev, raddr, &err);
|
||||
if (err == -EIO)
|
||||
return;
|
||||
qlcnic_83xx_wrt_reg_indirect(p_dev, waddr, value);
|
||||
}
|
||||
|
||||
@@ -1626,12 +1648,16 @@ static void qlcnic_83xx_rmw_crb_reg(struct qlcnic_adapter *p_dev,
|
||||
u32 raddr, u32 waddr,
|
||||
struct qlc_83xx_rmw *p_rmw_hdr)
|
||||
{
|
||||
int value;
|
||||
int err = 0;
|
||||
u32 value;
|
||||
|
||||
if (p_rmw_hdr->index_a)
|
||||
if (p_rmw_hdr->index_a) {
|
||||
value = p_dev->ahw->reset.array[p_rmw_hdr->index_a];
|
||||
else
|
||||
value = qlcnic_83xx_rd_reg_indirect(p_dev, raddr);
|
||||
} else {
|
||||
value = QLCRD32(p_dev, raddr, &err);
|
||||
if (err == -EIO)
|
||||
return;
|
||||
}
|
||||
|
||||
value &= p_rmw_hdr->mask;
|
||||
value <<= p_rmw_hdr->shl;
|
||||
@@ -1684,7 +1710,7 @@ static void qlcnic_83xx_poll_list(struct qlcnic_adapter *p_dev,
|
||||
long delay;
|
||||
struct qlc_83xx_entry *entry;
|
||||
struct qlc_83xx_poll *poll;
|
||||
int i;
|
||||
int i, err = 0;
|
||||
unsigned long arg1, arg2;
|
||||
|
||||
poll = (struct qlc_83xx_poll *)((char *)p_hdr +
|
||||
@@ -1708,10 +1734,12 @@ static void qlcnic_83xx_poll_list(struct qlcnic_adapter *p_dev,
|
||||
arg1, delay,
|
||||
poll->mask,
|
||||
poll->status)){
|
||||
qlcnic_83xx_rd_reg_indirect(p_dev,
|
||||
arg1);
|
||||
qlcnic_83xx_rd_reg_indirect(p_dev,
|
||||
arg2);
|
||||
QLCRD32(p_dev, arg1, &err);
|
||||
if (err == -EIO)
|
||||
return;
|
||||
QLCRD32(p_dev, arg2, &err);
|
||||
if (err == -EIO)
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1777,7 +1805,7 @@ static void qlcnic_83xx_poll_read_list(struct qlcnic_adapter *p_dev,
|
||||
struct qlc_83xx_entry_hdr *p_hdr)
|
||||
{
|
||||
long delay;
|
||||
int index, i, j;
|
||||
int index, i, j, err;
|
||||
struct qlc_83xx_quad_entry *entry;
|
||||
struct qlc_83xx_poll *poll;
|
||||
unsigned long addr;
|
||||
@@ -1797,7 +1825,10 @@ static void qlcnic_83xx_poll_read_list(struct qlcnic_adapter *p_dev,
|
||||
poll->mask, poll->status)){
|
||||
index = p_dev->ahw->reset.array_index;
|
||||
addr = entry->dr_addr;
|
||||
j = qlcnic_83xx_rd_reg_indirect(p_dev, addr);
|
||||
j = QLCRD32(p_dev, addr, &err);
|
||||
if (err == -EIO)
|
||||
return;
|
||||
|
||||
p_dev->ahw->reset.array[index++] = j;
|
||||
|
||||
if (index == QLC_83XX_MAX_RESET_SEQ_ENTRIES)
|
||||
@@ -2150,6 +2181,8 @@ int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac)
|
||||
|
||||
qlcnic_83xx_clear_function_resources(adapter);
|
||||
|
||||
INIT_DELAYED_WORK(&adapter->idc_aen_work, qlcnic_83xx_idc_aen_work);
|
||||
|
||||
/* register for NIC IDC AEN Events */
|
||||
qlcnic_83xx_register_nic_idc_func(adapter, 1);
|
||||
|
||||
@@ -2170,8 +2203,6 @@ int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac)
|
||||
if (err)
|
||||
goto disable_mbx_intr;
|
||||
|
||||
INIT_DELAYED_WORK(&adapter->idc_aen_work, qlcnic_83xx_idc_aen_work);
|
||||
|
||||
/* Periodically monitor device status */
|
||||
qlcnic_83xx_idc_poll_dev_state(&adapter->fw_work.work);
|
||||
return 0;
|
||||
|
@@ -104,7 +104,7 @@ static u32
|
||||
qlcnic_poll_rsp(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
u32 rsp;
|
||||
int timeout = 0;
|
||||
int timeout = 0, err = 0;
|
||||
|
||||
do {
|
||||
/* give atleast 1ms for firmware to respond */
|
||||
@@ -113,7 +113,7 @@ qlcnic_poll_rsp(struct qlcnic_adapter *adapter)
|
||||
if (++timeout > QLCNIC_OS_CRB_RETRY_COUNT)
|
||||
return QLCNIC_CDRP_RSP_TIMEOUT;
|
||||
|
||||
rsp = QLCRD32(adapter, QLCNIC_CDRP_CRB_OFFSET);
|
||||
rsp = QLCRD32(adapter, QLCNIC_CDRP_CRB_OFFSET, &err);
|
||||
} while (!QLCNIC_CDRP_IS_RSP(rsp));
|
||||
|
||||
return rsp;
|
||||
@@ -122,7 +122,7 @@ qlcnic_poll_rsp(struct qlcnic_adapter *adapter)
|
||||
int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter,
|
||||
struct qlcnic_cmd_args *cmd)
|
||||
{
|
||||
int i;
|
||||
int i, err = 0;
|
||||
u32 rsp;
|
||||
u32 signature;
|
||||
struct pci_dev *pdev = adapter->pdev;
|
||||
@@ -148,7 +148,7 @@ int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter,
|
||||
dev_err(&pdev->dev, "card response timeout.\n");
|
||||
cmd->rsp.arg[0] = QLCNIC_RCODE_TIMEOUT;
|
||||
} else if (rsp == QLCNIC_CDRP_RSP_FAIL) {
|
||||
cmd->rsp.arg[0] = QLCRD32(adapter, QLCNIC_CDRP_ARG(1));
|
||||
cmd->rsp.arg[0] = QLCRD32(adapter, QLCNIC_CDRP_ARG(1), &err);
|
||||
switch (cmd->rsp.arg[0]) {
|
||||
case QLCNIC_RCODE_INVALID_ARGS:
|
||||
fmt = "CDRP invalid args: [%d]\n";
|
||||
@@ -175,7 +175,7 @@ int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter,
|
||||
cmd->rsp.arg[0] = QLCNIC_RCODE_SUCCESS;
|
||||
|
||||
for (i = 1; i < cmd->rsp.num; i++)
|
||||
cmd->rsp.arg[i] = QLCRD32(adapter, QLCNIC_CDRP_ARG(i));
|
||||
cmd->rsp.arg[i] = QLCRD32(adapter, QLCNIC_CDRP_ARG(i), &err);
|
||||
|
||||
/* Release semaphore */
|
||||
qlcnic_api_unlock(adapter);
|
||||
@@ -210,10 +210,10 @@ int qlcnic_fw_cmd_set_drv_version(struct qlcnic_adapter *adapter, u32 fw_cmd)
|
||||
if (err) {
|
||||
dev_info(&adapter->pdev->dev,
|
||||
"Failed to set driver version in firmware\n");
|
||||
return -EIO;
|
||||
err = -EIO;
|
||||
}
|
||||
|
||||
return 0;
|
||||
qlcnic_free_mbx_args(&cmd);
|
||||
return err;
|
||||
}
|
||||
|
||||
int
|
||||
|
@@ -150,6 +150,7 @@ static const char qlcnic_gstrings_test[][ETH_GSTRING_LEN] = {
|
||||
"Link_Test_on_offline",
|
||||
"Interrupt_Test_offline",
|
||||
"Internal_Loopback_offline",
|
||||
"External_Loopback_offline",
|
||||
"EEPROM_Test_offline"
|
||||
};
|
||||
|
||||
@@ -266,7 +267,7 @@ int qlcnic_82xx_get_settings(struct qlcnic_adapter *adapter,
|
||||
{
|
||||
struct qlcnic_hardware_context *ahw = adapter->ahw;
|
||||
u32 speed, reg;
|
||||
int check_sfp_module = 0;
|
||||
int check_sfp_module = 0, err = 0;
|
||||
u16 pcifn = ahw->pci_func;
|
||||
|
||||
/* read which mode */
|
||||
@@ -289,7 +290,7 @@ int qlcnic_82xx_get_settings(struct qlcnic_adapter *adapter,
|
||||
|
||||
} else if (adapter->ahw->port_type == QLCNIC_XGBE) {
|
||||
u32 val = 0;
|
||||
val = QLCRD32(adapter, QLCNIC_PORT_MODE_ADDR);
|
||||
val = QLCRD32(adapter, QLCNIC_PORT_MODE_ADDR, &err);
|
||||
|
||||
if (val == QLCNIC_PORT_MODE_802_3_AP) {
|
||||
ecmd->supported = SUPPORTED_1000baseT_Full;
|
||||
@@ -300,9 +301,13 @@ int qlcnic_82xx_get_settings(struct qlcnic_adapter *adapter,
|
||||
}
|
||||
|
||||
if (netif_running(adapter->netdev) && ahw->has_link_events) {
|
||||
reg = QLCRD32(adapter, P3P_LINK_SPEED_REG(pcifn));
|
||||
speed = P3P_LINK_SPEED_VAL(pcifn, reg);
|
||||
ahw->link_speed = speed * P3P_LINK_SPEED_MHZ;
|
||||
if (ahw->linkup) {
|
||||
reg = QLCRD32(adapter,
|
||||
P3P_LINK_SPEED_REG(pcifn), &err);
|
||||
speed = P3P_LINK_SPEED_VAL(pcifn, reg);
|
||||
ahw->link_speed = speed * P3P_LINK_SPEED_MHZ;
|
||||
}
|
||||
|
||||
ethtool_cmd_speed_set(ecmd, ahw->link_speed);
|
||||
ecmd->autoneg = ahw->link_autoneg;
|
||||
ecmd->duplex = ahw->link_duplex;
|
||||
@@ -463,13 +468,14 @@ static int qlcnic_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
|
||||
static int qlcnic_82xx_get_registers(struct qlcnic_adapter *adapter,
|
||||
u32 *regs_buff)
|
||||
{
|
||||
int i, j = 0;
|
||||
int i, j = 0, err = 0;
|
||||
|
||||
for (i = QLCNIC_DEV_INFO_SIZE + 1; diag_registers[j] != -1; j++, i++)
|
||||
regs_buff[i] = QLC_SHARED_REG_RD32(adapter, diag_registers[j]);
|
||||
j = 0;
|
||||
while (ext_diag_registers[j] != -1)
|
||||
regs_buff[i++] = QLCRD32(adapter, ext_diag_registers[j++]);
|
||||
regs_buff[i++] = QLCRD32(adapter, ext_diag_registers[j++],
|
||||
&err);
|
||||
return i;
|
||||
}
|
||||
|
||||
@@ -519,13 +525,16 @@ qlcnic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p)
|
||||
static u32 qlcnic_test_link(struct net_device *dev)
|
||||
{
|
||||
struct qlcnic_adapter *adapter = netdev_priv(dev);
|
||||
int err = 0;
|
||||
u32 val;
|
||||
|
||||
if (qlcnic_83xx_check(adapter)) {
|
||||
val = qlcnic_83xx_test_link(adapter);
|
||||
return (val & 1) ? 0 : 1;
|
||||
}
|
||||
val = QLCRD32(adapter, CRB_XG_STATE_P3P);
|
||||
val = QLCRD32(adapter, CRB_XG_STATE_P3P, &err);
|
||||
if (err == -EIO)
|
||||
return err;
|
||||
val = XG_LINK_STATE_P3P(adapter->ahw->pci_func, val);
|
||||
return (val == XG_LINK_UP_P3P) ? 0 : 1;
|
||||
}
|
||||
@@ -658,6 +667,7 @@ qlcnic_get_pauseparam(struct net_device *netdev,
|
||||
{
|
||||
struct qlcnic_adapter *adapter = netdev_priv(netdev);
|
||||
int port = adapter->ahw->physical_port;
|
||||
int err = 0;
|
||||
__u32 val;
|
||||
|
||||
if (qlcnic_83xx_check(adapter)) {
|
||||
@@ -668,9 +678,13 @@ qlcnic_get_pauseparam(struct net_device *netdev,
|
||||
if ((port < 0) || (port > QLCNIC_NIU_MAX_GBE_PORTS))
|
||||
return;
|
||||
/* get flow control settings */
|
||||
val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port));
|
||||
val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), &err);
|
||||
if (err == -EIO)
|
||||
return;
|
||||
pause->rx_pause = qlcnic_gb_get_rx_flowctl(val);
|
||||
val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL);
|
||||
val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL, &err);
|
||||
if (err == -EIO)
|
||||
return;
|
||||
switch (port) {
|
||||
case 0:
|
||||
pause->tx_pause = !(qlcnic_gb_get_gb0_mask(val));
|
||||
@@ -690,7 +704,9 @@ qlcnic_get_pauseparam(struct net_device *netdev,
|
||||
if ((port < 0) || (port > QLCNIC_NIU_MAX_XG_PORTS))
|
||||
return;
|
||||
pause->rx_pause = 1;
|
||||
val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL);
|
||||
val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL, &err);
|
||||
if (err == -EIO)
|
||||
return;
|
||||
if (port == 0)
|
||||
pause->tx_pause = !(qlcnic_xg_get_xg0_mask(val));
|
||||
else
|
||||
@@ -707,6 +723,7 @@ qlcnic_set_pauseparam(struct net_device *netdev,
|
||||
{
|
||||
struct qlcnic_adapter *adapter = netdev_priv(netdev);
|
||||
int port = adapter->ahw->physical_port;
|
||||
int err = 0;
|
||||
__u32 val;
|
||||
|
||||
if (qlcnic_83xx_check(adapter))
|
||||
@@ -717,7 +734,9 @@ qlcnic_set_pauseparam(struct net_device *netdev,
|
||||
if ((port < 0) || (port > QLCNIC_NIU_MAX_GBE_PORTS))
|
||||
return -EIO;
|
||||
/* set flow control */
|
||||
val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port));
|
||||
val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), &err);
|
||||
if (err == -EIO)
|
||||
return err;
|
||||
|
||||
if (pause->rx_pause)
|
||||
qlcnic_gb_rx_flowctl(val);
|
||||
@@ -728,7 +747,9 @@ qlcnic_set_pauseparam(struct net_device *netdev,
|
||||
val);
|
||||
QLCWR32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), val);
|
||||
/* set autoneg */
|
||||
val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL);
|
||||
val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL, &err);
|
||||
if (err == -EIO)
|
||||
return err;
|
||||
switch (port) {
|
||||
case 0:
|
||||
if (pause->tx_pause)
|
||||
@@ -764,7 +785,9 @@ qlcnic_set_pauseparam(struct net_device *netdev,
|
||||
if ((port < 0) || (port > QLCNIC_NIU_MAX_XG_PORTS))
|
||||
return -EIO;
|
||||
|
||||
val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL);
|
||||
val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL, &err);
|
||||
if (err == -EIO)
|
||||
return err;
|
||||
if (port == 0) {
|
||||
if (pause->tx_pause)
|
||||
qlcnic_xg_unset_xg0_mask(val);
|
||||
@@ -788,11 +811,14 @@ static int qlcnic_reg_test(struct net_device *dev)
|
||||
{
|
||||
struct qlcnic_adapter *adapter = netdev_priv(dev);
|
||||
u32 data_read;
|
||||
int err = 0;
|
||||
|
||||
if (qlcnic_83xx_check(adapter))
|
||||
return qlcnic_83xx_reg_test(adapter);
|
||||
|
||||
data_read = QLCRD32(adapter, QLCNIC_PCIX_PH_REG(0));
|
||||
data_read = QLCRD32(adapter, QLCNIC_PCIX_PH_REG(0), &err);
|
||||
if (err == -EIO)
|
||||
return err;
|
||||
if ((data_read & 0xffff) != adapter->pdev->vendor)
|
||||
return 1;
|
||||
|
||||
@@ -1026,8 +1052,15 @@ qlcnic_diag_test(struct net_device *dev, struct ethtool_test *eth_test,
|
||||
if (data[3])
|
||||
eth_test->flags |= ETH_TEST_FL_FAILED;
|
||||
|
||||
data[4] = qlcnic_eeprom_test(dev);
|
||||
if (data[4])
|
||||
if (eth_test->flags & ETH_TEST_FL_EXTERNAL_LB) {
|
||||
data[4] = qlcnic_loopback_test(dev, QLCNIC_ELB_MODE);
|
||||
if (data[4])
|
||||
eth_test->flags |= ETH_TEST_FL_FAILED;
|
||||
eth_test->flags |= ETH_TEST_FL_EXTERNAL_LB_DONE;
|
||||
}
|
||||
|
||||
data[5] = qlcnic_eeprom_test(dev);
|
||||
if (data[5])
|
||||
eth_test->flags |= ETH_TEST_FL_FAILED;
|
||||
}
|
||||
}
|
||||
@@ -1257,17 +1290,20 @@ qlcnic_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
|
||||
{
|
||||
struct qlcnic_adapter *adapter = netdev_priv(dev);
|
||||
u32 wol_cfg;
|
||||
int err = 0;
|
||||
|
||||
if (qlcnic_83xx_check(adapter))
|
||||
return;
|
||||
wol->supported = 0;
|
||||
wol->wolopts = 0;
|
||||
|
||||
wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV);
|
||||
wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV, &err);
|
||||
if (err == -EIO)
|
||||
return;
|
||||
if (wol_cfg & (1UL << adapter->portnum))
|
||||
wol->supported |= WAKE_MAGIC;
|
||||
|
||||
wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG);
|
||||
wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG, &err);
|
||||
if (wol_cfg & (1UL << adapter->portnum))
|
||||
wol->wolopts |= WAKE_MAGIC;
|
||||
}
|
||||
@@ -1277,17 +1313,22 @@ qlcnic_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
|
||||
{
|
||||
struct qlcnic_adapter *adapter = netdev_priv(dev);
|
||||
u32 wol_cfg;
|
||||
int err = 0;
|
||||
|
||||
if (qlcnic_83xx_check(adapter))
|
||||
return -EOPNOTSUPP;
|
||||
if (wol->wolopts & ~WAKE_MAGIC)
|
||||
return -EINVAL;
|
||||
|
||||
wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV);
|
||||
wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV, &err);
|
||||
if (err == -EIO)
|
||||
return err;
|
||||
if (!(wol_cfg & (1 << adapter->portnum)))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG);
|
||||
wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG, &err);
|
||||
if (err == -EIO)
|
||||
return err;
|
||||
if (wol->wolopts & WAKE_MAGIC)
|
||||
wol_cfg |= 1UL << adapter->portnum;
|
||||
else
|
||||
@@ -1540,7 +1581,7 @@ qlcnic_set_dump(struct net_device *netdev, struct ethtool_dump *val)
|
||||
return 0;
|
||||
case QLCNIC_SET_QUIESCENT:
|
||||
case QLCNIC_RESET_QUIESCENT:
|
||||
state = QLCRD32(adapter, QLCNIC_CRB_DEV_STATE);
|
||||
state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE);
|
||||
if (state == QLCNIC_DEV_FAILED || (state == QLCNIC_DEV_BADBAD))
|
||||
netdev_info(netdev, "Device in FAILED state\n");
|
||||
return 0;
|
||||
|
@@ -317,16 +317,20 @@ static void qlcnic_write_window_reg(u32 addr, void __iomem *bar0, u32 data)
|
||||
int
|
||||
qlcnic_pcie_sem_lock(struct qlcnic_adapter *adapter, int sem, u32 id_reg)
|
||||
{
|
||||
int done = 0, timeout = 0;
|
||||
int timeout = 0;
|
||||
int err = 0;
|
||||
u32 done = 0;
|
||||
|
||||
while (!done) {
|
||||
done = QLCRD32(adapter, QLCNIC_PCIE_REG(PCIE_SEM_LOCK(sem)));
|
||||
done = QLCRD32(adapter, QLCNIC_PCIE_REG(PCIE_SEM_LOCK(sem)),
|
||||
&err);
|
||||
if (done == 1)
|
||||
break;
|
||||
if (++timeout >= QLCNIC_PCIE_SEM_TIMEOUT) {
|
||||
dev_err(&adapter->pdev->dev,
|
||||
"Failed to acquire sem=%d lock; holdby=%d\n",
|
||||
sem, id_reg ? QLCRD32(adapter, id_reg) : -1);
|
||||
sem,
|
||||
id_reg ? QLCRD32(adapter, id_reg, &err) : -1);
|
||||
return -EIO;
|
||||
}
|
||||
msleep(1);
|
||||
@@ -341,19 +345,22 @@ qlcnic_pcie_sem_lock(struct qlcnic_adapter *adapter, int sem, u32 id_reg)
|
||||
void
|
||||
qlcnic_pcie_sem_unlock(struct qlcnic_adapter *adapter, int sem)
|
||||
{
|
||||
QLCRD32(adapter, QLCNIC_PCIE_REG(PCIE_SEM_UNLOCK(sem)));
|
||||
int err = 0;
|
||||
|
||||
QLCRD32(adapter, QLCNIC_PCIE_REG(PCIE_SEM_UNLOCK(sem)), &err);
|
||||
}
|
||||
|
||||
int qlcnic_ind_rd(struct qlcnic_adapter *adapter, u32 addr)
|
||||
{
|
||||
int err = 0;
|
||||
u32 data;
|
||||
|
||||
if (qlcnic_82xx_check(adapter))
|
||||
qlcnic_read_window_reg(addr, adapter->ahw->pci_base0, &data);
|
||||
else {
|
||||
data = qlcnic_83xx_rd_reg_indirect(adapter, addr);
|
||||
if (data == -EIO)
|
||||
return -EIO;
|
||||
data = QLCRD32(adapter, addr, &err);
|
||||
if (err == -EIO)
|
||||
return err;
|
||||
}
|
||||
return data;
|
||||
}
|
||||
@@ -516,20 +523,18 @@ void __qlcnic_set_multi(struct net_device *netdev, u16 vlan)
|
||||
if (netdev->flags & IFF_PROMISC) {
|
||||
if (!(adapter->flags & QLCNIC_PROMISC_DISABLED))
|
||||
mode = VPORT_MISS_MODE_ACCEPT_ALL;
|
||||
} else if (netdev->flags & IFF_ALLMULTI) {
|
||||
if (netdev_mc_count(netdev) > ahw->max_mc_count) {
|
||||
mode = VPORT_MISS_MODE_ACCEPT_MULTI;
|
||||
} else if (!netdev_mc_empty(netdev) &&
|
||||
!qlcnic_sriov_vf_check(adapter)) {
|
||||
netdev_for_each_mc_addr(ha, netdev)
|
||||
qlcnic_nic_add_mac(adapter, ha->addr,
|
||||
vlan);
|
||||
}
|
||||
if (mode != VPORT_MISS_MODE_ACCEPT_MULTI &&
|
||||
qlcnic_sriov_vf_check(adapter))
|
||||
qlcnic_vf_add_mc_list(netdev, vlan);
|
||||
} else if ((netdev->flags & IFF_ALLMULTI) ||
|
||||
(netdev_mc_count(netdev) > ahw->max_mc_count)) {
|
||||
mode = VPORT_MISS_MODE_ACCEPT_MULTI;
|
||||
} else if (!netdev_mc_empty(netdev) &&
|
||||
!qlcnic_sriov_vf_check(adapter)) {
|
||||
netdev_for_each_mc_addr(ha, netdev)
|
||||
qlcnic_nic_add_mac(adapter, ha->addr, vlan);
|
||||
}
|
||||
|
||||
if (qlcnic_sriov_vf_check(adapter))
|
||||
qlcnic_vf_add_mc_list(netdev, vlan);
|
||||
|
||||
/* configure unicast MAC address, if there is not sufficient space
|
||||
* to store all the unicast addresses then enable promiscuous mode
|
||||
*/
|
||||
@@ -1161,7 +1166,8 @@ int qlcnic_82xx_hw_write_wx_2M(struct qlcnic_adapter *adapter, ulong off,
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
int qlcnic_82xx_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong off)
|
||||
int qlcnic_82xx_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong off,
|
||||
int *err)
|
||||
{
|
||||
unsigned long flags;
|
||||
int rv;
|
||||
@@ -1417,7 +1423,7 @@ int qlcnic_pci_mem_read_2M(struct qlcnic_adapter *adapter, u64 off, u64 *data)
|
||||
|
||||
int qlcnic_82xx_get_board_info(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
int offset, board_type, magic;
|
||||
int offset, board_type, magic, err = 0;
|
||||
struct pci_dev *pdev = adapter->pdev;
|
||||
|
||||
offset = QLCNIC_FW_MAGIC_OFFSET;
|
||||
@@ -1437,7 +1443,9 @@ int qlcnic_82xx_get_board_info(struct qlcnic_adapter *adapter)
|
||||
adapter->ahw->board_type = board_type;
|
||||
|
||||
if (board_type == QLCNIC_BRDTYPE_P3P_4_GB_MM) {
|
||||
u32 gpio = QLCRD32(adapter, QLCNIC_ROMUSB_GLB_PAD_GPIO_I);
|
||||
u32 gpio = QLCRD32(adapter, QLCNIC_ROMUSB_GLB_PAD_GPIO_I, &err);
|
||||
if (err == -EIO)
|
||||
return err;
|
||||
if ((gpio & 0x8000) == 0)
|
||||
board_type = QLCNIC_BRDTYPE_P3P_10G_TP;
|
||||
}
|
||||
@@ -1477,10 +1485,13 @@ int
|
||||
qlcnic_wol_supported(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
u32 wol_cfg;
|
||||
int err = 0;
|
||||
|
||||
wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV);
|
||||
wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV, &err);
|
||||
if (wol_cfg & (1UL << adapter->portnum)) {
|
||||
wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG);
|
||||
wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG, &err);
|
||||
if (err == -EIO)
|
||||
return err;
|
||||
if (wol_cfg & (1 << adapter->portnum))
|
||||
return 1;
|
||||
}
|
||||
@@ -1541,6 +1552,7 @@ void qlcnic_82xx_get_func_no(struct qlcnic_adapter *adapter)
|
||||
void qlcnic_82xx_read_crb(struct qlcnic_adapter *adapter, char *buf,
|
||||
loff_t offset, size_t size)
|
||||
{
|
||||
int err = 0;
|
||||
u32 data;
|
||||
u64 qmdata;
|
||||
|
||||
@@ -1548,7 +1560,7 @@ void qlcnic_82xx_read_crb(struct qlcnic_adapter *adapter, char *buf,
|
||||
qlcnic_pci_camqm_read_2M(adapter, offset, &qmdata);
|
||||
memcpy(buf, &qmdata, size);
|
||||
} else {
|
||||
data = QLCRD32(adapter, offset);
|
||||
data = QLCRD32(adapter, offset, &err);
|
||||
memcpy(buf, &data, size);
|
||||
}
|
||||
}
|
||||
|
@@ -154,7 +154,7 @@ struct qlcnic_hardware_context;
|
||||
struct qlcnic_adapter;
|
||||
|
||||
int qlcnic_82xx_start_firmware(struct qlcnic_adapter *);
|
||||
int qlcnic_82xx_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong);
|
||||
int qlcnic_82xx_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong, int *);
|
||||
int qlcnic_82xx_hw_write_wx_2M(struct qlcnic_adapter *, ulong, u32);
|
||||
int qlcnic_82xx_config_hw_lro(struct qlcnic_adapter *adapter, int);
|
||||
int qlcnic_82xx_nic_set_promisc(struct qlcnic_adapter *adapter, u32);
|
||||
|
@@ -142,7 +142,7 @@ void qlcnic_release_tx_buffers(struct qlcnic_adapter *adapter)
|
||||
buffrag->length, PCI_DMA_TODEVICE);
|
||||
buffrag->dma = 0ULL;
|
||||
}
|
||||
for (j = 0; j < cmd_buf->frag_count; j++) {
|
||||
for (j = 1; j < cmd_buf->frag_count; j++) {
|
||||
buffrag++;
|
||||
if (buffrag->dma) {
|
||||
pci_unmap_page(adapter->pdev, buffrag->dma,
|
||||
@@ -286,10 +286,11 @@ static int qlcnic_wait_rom_done(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
long timeout = 0;
|
||||
long done = 0;
|
||||
int err = 0;
|
||||
|
||||
cond_resched();
|
||||
while (done == 0) {
|
||||
done = QLCRD32(adapter, QLCNIC_ROMUSB_GLB_STATUS);
|
||||
done = QLCRD32(adapter, QLCNIC_ROMUSB_GLB_STATUS, &err);
|
||||
done &= 2;
|
||||
if (++timeout >= QLCNIC_MAX_ROM_WAIT_USEC) {
|
||||
dev_err(&adapter->pdev->dev,
|
||||
@@ -304,6 +305,8 @@ static int qlcnic_wait_rom_done(struct qlcnic_adapter *adapter)
|
||||
static int do_rom_fast_read(struct qlcnic_adapter *adapter,
|
||||
u32 addr, u32 *valp)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
QLCWR32(adapter, QLCNIC_ROMUSB_ROM_ADDRESS, addr);
|
||||
QLCWR32(adapter, QLCNIC_ROMUSB_ROM_DUMMY_BYTE_CNT, 0);
|
||||
QLCWR32(adapter, QLCNIC_ROMUSB_ROM_ABYTE_CNT, 3);
|
||||
@@ -317,7 +320,9 @@ static int do_rom_fast_read(struct qlcnic_adapter *adapter,
|
||||
udelay(10);
|
||||
QLCWR32(adapter, QLCNIC_ROMUSB_ROM_DUMMY_BYTE_CNT, 0);
|
||||
|
||||
*valp = QLCRD32(adapter, QLCNIC_ROMUSB_ROM_RDATA);
|
||||
*valp = QLCRD32(adapter, QLCNIC_ROMUSB_ROM_RDATA, &err);
|
||||
if (err == -EIO)
|
||||
return err;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -369,11 +374,11 @@ int qlcnic_rom_fast_read(struct qlcnic_adapter *adapter, u32 addr, u32 *valp)
|
||||
|
||||
int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
int addr, val;
|
||||
int addr, err = 0;
|
||||
int i, n, init_delay;
|
||||
struct crb_addr_pair *buf;
|
||||
unsigned offset;
|
||||
u32 off;
|
||||
u32 off, val;
|
||||
struct pci_dev *pdev = adapter->pdev;
|
||||
|
||||
QLC_SHARED_REG_WR32(adapter, QLCNIC_CMDPEG_STATE, 0);
|
||||
@@ -402,7 +407,9 @@ int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter)
|
||||
QLCWR32(adapter, QLCNIC_CRB_NIU + 0xb0000, 0x00);
|
||||
|
||||
/* halt sre */
|
||||
val = QLCRD32(adapter, QLCNIC_CRB_SRE + 0x1000);
|
||||
val = QLCRD32(adapter, QLCNIC_CRB_SRE + 0x1000, &err);
|
||||
if (err == -EIO)
|
||||
return err;
|
||||
QLCWR32(adapter, QLCNIC_CRB_SRE + 0x1000, val & (~(0x1)));
|
||||
|
||||
/* halt epg */
|
||||
@@ -719,10 +726,12 @@ qlcnic_check_flash_fw_ver(struct qlcnic_adapter *adapter)
|
||||
static int
|
||||
qlcnic_has_mn(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
u32 capability;
|
||||
capability = 0;
|
||||
u32 capability = 0;
|
||||
int err = 0;
|
||||
|
||||
capability = QLCRD32(adapter, QLCNIC_PEG_TUNE_CAPABILITY);
|
||||
capability = QLCRD32(adapter, QLCNIC_PEG_TUNE_CAPABILITY, &err);
|
||||
if (err == -EIO)
|
||||
return err;
|
||||
if (capability & QLCNIC_PEG_TUNE_MN_PRESENT)
|
||||
return 1;
|
||||
|
||||
|
@@ -161,36 +161,68 @@ static inline int qlcnic_82xx_is_lb_pkt(u64 sts_data)
|
||||
return (qlcnic_get_sts_status(sts_data) == STATUS_CKSUM_LOOP) ? 1 : 0;
|
||||
}
|
||||
|
||||
static void qlcnic_delete_rx_list_mac(struct qlcnic_adapter *adapter,
|
||||
struct qlcnic_filter *fil,
|
||||
void *addr, u16 vlan_id)
|
||||
{
|
||||
int ret;
|
||||
u8 op;
|
||||
|
||||
op = vlan_id ? QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_ADD;
|
||||
ret = qlcnic_sre_macaddr_change(adapter, addr, vlan_id, op);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
op = vlan_id ? QLCNIC_MAC_VLAN_DEL : QLCNIC_MAC_DEL;
|
||||
ret = qlcnic_sre_macaddr_change(adapter, addr, vlan_id, op);
|
||||
if (!ret) {
|
||||
hlist_del(&fil->fnode);
|
||||
adapter->rx_fhash.fnum--;
|
||||
}
|
||||
}
|
||||
|
||||
static struct qlcnic_filter *qlcnic_find_mac_filter(struct hlist_head *head,
|
||||
void *addr, u16 vlan_id)
|
||||
{
|
||||
struct qlcnic_filter *tmp_fil = NULL;
|
||||
struct hlist_node *n;
|
||||
|
||||
hlist_for_each_entry_safe(tmp_fil, n, head, fnode) {
|
||||
if (!memcmp(tmp_fil->faddr, addr, ETH_ALEN) &&
|
||||
tmp_fil->vlan_id == vlan_id)
|
||||
return tmp_fil;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void qlcnic_add_lb_filter(struct qlcnic_adapter *adapter, struct sk_buff *skb,
|
||||
int loopback_pkt, u16 vlan_id)
|
||||
{
|
||||
struct ethhdr *phdr = (struct ethhdr *)(skb->data);
|
||||
struct qlcnic_filter *fil, *tmp_fil;
|
||||
struct hlist_node *n;
|
||||
struct hlist_head *head;
|
||||
unsigned long time;
|
||||
u64 src_addr = 0;
|
||||
u8 hindex, found = 0, op;
|
||||
u8 hindex, op;
|
||||
int ret;
|
||||
|
||||
memcpy(&src_addr, phdr->h_source, ETH_ALEN);
|
||||
hindex = qlcnic_mac_hash(src_addr) &
|
||||
(adapter->fhash.fbucket_size - 1);
|
||||
|
||||
if (loopback_pkt) {
|
||||
if (adapter->rx_fhash.fnum >= adapter->rx_fhash.fmax)
|
||||
return;
|
||||
|
||||
hindex = qlcnic_mac_hash(src_addr) &
|
||||
(adapter->fhash.fbucket_size - 1);
|
||||
head = &(adapter->rx_fhash.fhead[hindex]);
|
||||
|
||||
hlist_for_each_entry_safe(tmp_fil, n, head, fnode) {
|
||||
if (!memcmp(tmp_fil->faddr, &src_addr, ETH_ALEN) &&
|
||||
tmp_fil->vlan_id == vlan_id) {
|
||||
time = tmp_fil->ftime;
|
||||
if (jiffies > (QLCNIC_READD_AGE * HZ + time))
|
||||
tmp_fil->ftime = jiffies;
|
||||
return;
|
||||
}
|
||||
tmp_fil = qlcnic_find_mac_filter(head, &src_addr, vlan_id);
|
||||
if (tmp_fil) {
|
||||
time = tmp_fil->ftime;
|
||||
if (time_after(jiffies, QLCNIC_READD_AGE * HZ + time))
|
||||
tmp_fil->ftime = jiffies;
|
||||
return;
|
||||
}
|
||||
|
||||
fil = kzalloc(sizeof(struct qlcnic_filter), GFP_ATOMIC);
|
||||
@@ -205,36 +237,37 @@ void qlcnic_add_lb_filter(struct qlcnic_adapter *adapter, struct sk_buff *skb,
|
||||
adapter->rx_fhash.fnum++;
|
||||
spin_unlock(&adapter->rx_mac_learn_lock);
|
||||
} else {
|
||||
hindex = qlcnic_mac_hash(src_addr) &
|
||||
(adapter->fhash.fbucket_size - 1);
|
||||
head = &(adapter->rx_fhash.fhead[hindex]);
|
||||
spin_lock(&adapter->rx_mac_learn_lock);
|
||||
hlist_for_each_entry_safe(tmp_fil, n, head, fnode) {
|
||||
if (!memcmp(tmp_fil->faddr, &src_addr, ETH_ALEN) &&
|
||||
tmp_fil->vlan_id == vlan_id) {
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
head = &adapter->fhash.fhead[hindex];
|
||||
|
||||
if (!found) {
|
||||
spin_unlock(&adapter->rx_mac_learn_lock);
|
||||
return;
|
||||
}
|
||||
spin_lock(&adapter->mac_learn_lock);
|
||||
|
||||
op = vlan_id ? QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_ADD;
|
||||
ret = qlcnic_sre_macaddr_change(adapter, (u8 *)&src_addr,
|
||||
vlan_id, op);
|
||||
if (!ret) {
|
||||
tmp_fil = qlcnic_find_mac_filter(head, &src_addr, vlan_id);
|
||||
if (tmp_fil) {
|
||||
op = vlan_id ? QLCNIC_MAC_VLAN_DEL : QLCNIC_MAC_DEL;
|
||||
ret = qlcnic_sre_macaddr_change(adapter,
|
||||
(u8 *)&src_addr,
|
||||
vlan_id, op);
|
||||
if (!ret) {
|
||||
hlist_del(&(tmp_fil->fnode));
|
||||
adapter->rx_fhash.fnum--;
|
||||
hlist_del(&tmp_fil->fnode);
|
||||
adapter->fhash.fnum--;
|
||||
}
|
||||
|
||||
spin_unlock(&adapter->mac_learn_lock);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
spin_unlock(&adapter->mac_learn_lock);
|
||||
|
||||
head = &adapter->rx_fhash.fhead[hindex];
|
||||
|
||||
spin_lock(&adapter->rx_mac_learn_lock);
|
||||
|
||||
tmp_fil = qlcnic_find_mac_filter(head, &src_addr, vlan_id);
|
||||
if (tmp_fil)
|
||||
qlcnic_delete_rx_list_mac(adapter, tmp_fil, &src_addr,
|
||||
vlan_id);
|
||||
|
||||
spin_unlock(&adapter->rx_mac_learn_lock);
|
||||
}
|
||||
}
|
||||
@@ -262,7 +295,7 @@ void qlcnic_82xx_change_filter(struct qlcnic_adapter *adapter, u64 *uaddr,
|
||||
|
||||
mac_req = (struct qlcnic_mac_req *)&(req->words[0]);
|
||||
mac_req->op = vlan_id ? QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_ADD;
|
||||
memcpy(mac_req->mac_addr, &uaddr, ETH_ALEN);
|
||||
memcpy(mac_req->mac_addr, uaddr, ETH_ALEN);
|
||||
|
||||
vlan_req = (struct qlcnic_vlan_req *)&req->words[1];
|
||||
vlan_req->vlan_id = cpu_to_le16(vlan_id);
|
||||
|
@@ -977,8 +977,8 @@ qlcnic_check_options(struct qlcnic_adapter *adapter)
|
||||
static int
|
||||
qlcnic_initialize_nic(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
int err;
|
||||
struct qlcnic_info nic_info;
|
||||
int err = 0;
|
||||
|
||||
memset(&nic_info, 0, sizeof(struct qlcnic_info));
|
||||
err = qlcnic_get_nic_info(adapter, &nic_info, adapter->ahw->pci_func);
|
||||
@@ -993,7 +993,9 @@ qlcnic_initialize_nic(struct qlcnic_adapter *adapter)
|
||||
|
||||
if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) {
|
||||
u32 temp;
|
||||
temp = QLCRD32(adapter, CRB_FW_CAPABILITIES_2);
|
||||
temp = QLCRD32(adapter, CRB_FW_CAPABILITIES_2, &err);
|
||||
if (err == -EIO)
|
||||
return err;
|
||||
adapter->ahw->extra_capability[0] = temp;
|
||||
}
|
||||
adapter->ahw->max_mac_filters = nic_info.max_mac_filters;
|
||||
@@ -1383,6 +1385,8 @@ qlcnic_request_irq(struct qlcnic_adapter *adapter)
|
||||
if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) {
|
||||
if (qlcnic_82xx_check(adapter))
|
||||
handler = qlcnic_tmp_intr;
|
||||
else
|
||||
handler = qlcnic_83xx_tmp_intr;
|
||||
if (!QLCNIC_IS_MSI_FAMILY(adapter))
|
||||
flags |= IRQF_SHARED;
|
||||
|
||||
@@ -1531,12 +1535,12 @@ int __qlcnic_up(struct qlcnic_adapter *adapter, struct net_device *netdev)
|
||||
if (netdev->features & NETIF_F_LRO)
|
||||
qlcnic_config_hw_lro(adapter, QLCNIC_LRO_ENABLED);
|
||||
|
||||
set_bit(__QLCNIC_DEV_UP, &adapter->state);
|
||||
qlcnic_napi_enable(adapter);
|
||||
|
||||
qlcnic_linkevent_request(adapter, 1);
|
||||
|
||||
adapter->ahw->reset_context = 0;
|
||||
set_bit(__QLCNIC_DEV_UP, &adapter->state);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2139,7 +2143,7 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
if (qlcnic_83xx_check(adapter) && !qlcnic_use_msi_x &&
|
||||
!!qlcnic_use_msi)
|
||||
dev_warn(&pdev->dev,
|
||||
"83xx adapter do not support MSI interrupts\n");
|
||||
"Device does not support MSI interrupts\n");
|
||||
|
||||
if (qlcnic_82xx_check(adapter)) {
|
||||
err = qlcnic_setup_intr(adapter, 0);
|
||||
@@ -3091,6 +3095,7 @@ qlcnic_check_health(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
u32 state = 0, heartbeat;
|
||||
u32 peg_status;
|
||||
int err = 0;
|
||||
|
||||
if (qlcnic_check_temp(adapter))
|
||||
goto detach;
|
||||
@@ -3137,11 +3142,11 @@ qlcnic_check_health(struct qlcnic_adapter *adapter)
|
||||
"PEG_NET_4_PC: 0x%x\n",
|
||||
peg_status,
|
||||
QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS2),
|
||||
QLCRD32(adapter, QLCNIC_CRB_PEG_NET_0 + 0x3c),
|
||||
QLCRD32(adapter, QLCNIC_CRB_PEG_NET_1 + 0x3c),
|
||||
QLCRD32(adapter, QLCNIC_CRB_PEG_NET_2 + 0x3c),
|
||||
QLCRD32(adapter, QLCNIC_CRB_PEG_NET_3 + 0x3c),
|
||||
QLCRD32(adapter, QLCNIC_CRB_PEG_NET_4 + 0x3c));
|
||||
QLCRD32(adapter, QLCNIC_CRB_PEG_NET_0 + 0x3c, &err),
|
||||
QLCRD32(adapter, QLCNIC_CRB_PEG_NET_1 + 0x3c, &err),
|
||||
QLCRD32(adapter, QLCNIC_CRB_PEG_NET_2 + 0x3c, &err),
|
||||
QLCRD32(adapter, QLCNIC_CRB_PEG_NET_3 + 0x3c, &err),
|
||||
QLCRD32(adapter, QLCNIC_CRB_PEG_NET_4 + 0x3c, &err));
|
||||
if (QLCNIC_FWERROR_CODE(peg_status) == 0x67)
|
||||
dev_err(&adapter->pdev->dev,
|
||||
"Firmware aborted with error code 0x00006700. "
|
||||
|
@@ -1084,7 +1084,7 @@ flash_temp:
|
||||
tmpl_hdr = ahw->fw_dump.tmpl_hdr;
|
||||
tmpl_hdr->drv_cap_mask = QLCNIC_DUMP_MASK_DEF;
|
||||
|
||||
if ((tmpl_hdr->version & 0xffffff) >= 0x20001)
|
||||
if ((tmpl_hdr->version & 0xfffff) >= 0x20001)
|
||||
ahw->fw_dump.use_pex_dma = true;
|
||||
else
|
||||
ahw->fw_dump.use_pex_dma = false;
|
||||
|
@@ -504,7 +504,7 @@ static int qlcnic_sriov_setup_vf(struct qlcnic_adapter *adapter,
|
||||
INIT_LIST_HEAD(&adapter->vf_mc_list);
|
||||
if (!qlcnic_use_msi_x && !!qlcnic_use_msi)
|
||||
dev_warn(&adapter->pdev->dev,
|
||||
"83xx adapter do not support MSI interrupts\n");
|
||||
"Device does not support MSI interrupts\n");
|
||||
|
||||
err = qlcnic_setup_intr(adapter, 1);
|
||||
if (err) {
|
||||
@@ -702,6 +702,7 @@ static int qlcnic_sriov_alloc_bc_mbx_args(struct qlcnic_cmd_args *mbx, u32 type)
|
||||
memset(mbx->rsp.arg, 0, sizeof(u32) * mbx->rsp.num);
|
||||
mbx->req.arg[0] = (type | (mbx->req.num << 16) |
|
||||
(3 << 29));
|
||||
mbx->rsp.arg[0] = (type & 0xffff) | mbx->rsp.num << 16;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -753,6 +754,7 @@ static int qlcnic_sriov_prepare_bc_hdr(struct qlcnic_bc_trans *trans,
|
||||
cmd->req.num = trans->req_pay_size / 4;
|
||||
cmd->rsp.num = trans->rsp_pay_size / 4;
|
||||
hdr = trans->rsp_hdr;
|
||||
cmd->op_type = trans->req_hdr->op_type;
|
||||
}
|
||||
|
||||
trans->trans_id = seq;
|
||||
|
@@ -635,12 +635,12 @@ static int qlcnic_sriov_pf_channel_cfg_cmd(struct qlcnic_bc_trans *trans,
|
||||
struct qlcnic_cmd_args *cmd)
|
||||
{
|
||||
struct qlcnic_vf_info *vf = trans->vf;
|
||||
struct qlcnic_adapter *adapter = vf->adapter;
|
||||
int err;
|
||||
struct qlcnic_vport *vp = vf->vp;
|
||||
struct qlcnic_adapter *adapter;
|
||||
u16 func = vf->pci_func;
|
||||
int err;
|
||||
|
||||
cmd->rsp.arg[0] = trans->req_hdr->cmd_op;
|
||||
cmd->rsp.arg[0] |= (1 << 16);
|
||||
adapter = vf->adapter;
|
||||
|
||||
if (trans->req_hdr->cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT) {
|
||||
err = qlcnic_sriov_pf_config_vport(adapter, 1, func);
|
||||
@@ -650,6 +650,8 @@ static int qlcnic_sriov_pf_channel_cfg_cmd(struct qlcnic_bc_trans *trans,
|
||||
qlcnic_sriov_pf_config_vport(adapter, 0, func);
|
||||
}
|
||||
} else {
|
||||
if (vp->vlan_mode == QLC_GUEST_VLAN_MODE)
|
||||
vp->vlan = 0;
|
||||
err = qlcnic_sriov_pf_config_vport(adapter, 0, func);
|
||||
}
|
||||
|
||||
@@ -1183,7 +1185,7 @@ static int qlcnic_sriov_pf_get_acl_cmd(struct qlcnic_bc_trans *trans,
|
||||
u8 cmd_op, mode = vp->vlan_mode;
|
||||
|
||||
cmd_op = trans->req_hdr->cmd_op;
|
||||
cmd->rsp.arg[0] = (cmd_op & 0xffff) | 14 << 16 | 1 << 25;
|
||||
cmd->rsp.arg[0] |= 1 << 25;
|
||||
|
||||
switch (mode) {
|
||||
case QLC_GUEST_VLAN_MODE:
|
||||
@@ -1561,6 +1563,7 @@ void qlcnic_sriov_pf_handle_flr(struct qlcnic_sriov *sriov,
|
||||
struct qlcnic_vf_info *vf)
|
||||
{
|
||||
struct net_device *dev = vf->adapter->netdev;
|
||||
struct qlcnic_vport *vp = vf->vp;
|
||||
|
||||
if (!test_and_clear_bit(QLC_BC_VF_STATE, &vf->state)) {
|
||||
clear_bit(QLC_BC_VF_FLR, &vf->state);
|
||||
@@ -1573,6 +1576,9 @@ void qlcnic_sriov_pf_handle_flr(struct qlcnic_sriov *sriov,
|
||||
return;
|
||||
}
|
||||
|
||||
if (vp->vlan_mode == QLC_GUEST_VLAN_MODE)
|
||||
vp->vlan = 0;
|
||||
|
||||
qlcnic_sriov_schedule_flr(sriov, vf, qlcnic_sriov_pf_process_flr);
|
||||
netdev_info(dev, "FLR received for PCI func %d\n", vf->pci_func);
|
||||
}
|
||||
@@ -1621,13 +1627,15 @@ int qlcnic_sriov_set_vf_mac(struct net_device *netdev, int vf, u8 *mac)
|
||||
{
|
||||
struct qlcnic_adapter *adapter = netdev_priv(netdev);
|
||||
struct qlcnic_sriov *sriov = adapter->ahw->sriov;
|
||||
int i, num_vfs = sriov->num_vfs;
|
||||
int i, num_vfs;
|
||||
struct qlcnic_vf_info *vf_info;
|
||||
u8 *curr_mac;
|
||||
|
||||
if (!qlcnic_sriov_pf_check(adapter))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
num_vfs = sriov->num_vfs;
|
||||
|
||||
if (!is_valid_ether_addr(mac) || vf >= num_vfs)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -1741,6 +1749,7 @@ int qlcnic_sriov_set_vf_vlan(struct net_device *netdev, int vf,
|
||||
|
||||
switch (vlan) {
|
||||
case 4095:
|
||||
vp->vlan = 0;
|
||||
vp->vlan_mode = QLC_GUEST_VLAN_MODE;
|
||||
break;
|
||||
case 0:
|
||||
@@ -1759,6 +1768,29 @@ int qlcnic_sriov_set_vf_vlan(struct net_device *netdev, int vf,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline __u32 qlcnic_sriov_get_vf_vlan(struct qlcnic_adapter *adapter,
|
||||
struct qlcnic_vport *vp, int vf)
|
||||
{
|
||||
__u32 vlan = 0;
|
||||
|
||||
switch (vp->vlan_mode) {
|
||||
case QLC_PVID_MODE:
|
||||
vlan = vp->vlan;
|
||||
break;
|
||||
case QLC_GUEST_VLAN_MODE:
|
||||
vlan = MAX_VLAN_ID;
|
||||
break;
|
||||
case QLC_NO_VLAN_MODE:
|
||||
vlan = 0;
|
||||
break;
|
||||
default:
|
||||
netdev_info(adapter->netdev, "Invalid VLAN mode = %d for VF %d\n",
|
||||
vp->vlan_mode, vf);
|
||||
}
|
||||
|
||||
return vlan;
|
||||
}
|
||||
|
||||
int qlcnic_sriov_get_vf_config(struct net_device *netdev,
|
||||
int vf, struct ifla_vf_info *ivi)
|
||||
{
|
||||
@@ -1774,7 +1806,7 @@ int qlcnic_sriov_get_vf_config(struct net_device *netdev,
|
||||
|
||||
vp = sriov->vf_info[vf].vp;
|
||||
memcpy(&ivi->mac, vp->mac, ETH_ALEN);
|
||||
ivi->vlan = vp->vlan;
|
||||
ivi->vlan = qlcnic_sriov_get_vf_vlan(adapter, vp, vf);
|
||||
ivi->qos = vp->qos;
|
||||
ivi->spoofchk = vp->spoofchk;
|
||||
if (vp->max_tx_bw == MAX_BW)
|
||||
|
Reference in New Issue
Block a user