Commit 15087c2b authored by Sony Chacko's avatar Sony Chacko Committed by David S. Miller

qlcnic: modify PCI and register access routines

Refactor 82xx driver to support new adapter
Update PCI and hardware access routines
Signed-off-by: default avatarAnirban Chakraborty <anirban.chakraborty@qlogic.com>
Signed-off-by: default avatarSony Chacko <sony.chacko@qlogic.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 79788450
...@@ -1279,7 +1279,7 @@ struct qlcnic_cmd_args { ...@@ -1279,7 +1279,7 @@ struct qlcnic_cmd_args {
int qlcnic_fw_cmd_get_minidump_temp(struct qlcnic_adapter *adapter); int qlcnic_fw_cmd_get_minidump_temp(struct qlcnic_adapter *adapter);
int qlcnic_fw_cmd_set_port(struct qlcnic_adapter *adapter, u32 config); int qlcnic_fw_cmd_set_port(struct qlcnic_adapter *adapter, u32 config);
u32 qlcnic_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong off); int qlcnic_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong off);
int qlcnic_hw_write_wx_2M(struct qlcnic_adapter *, ulong off, u32 data); int qlcnic_hw_write_wx_2M(struct qlcnic_adapter *, ulong off, u32 data);
int qlcnic_pci_mem_write_2M(struct qlcnic_adapter *, u64 off, u64 data); int qlcnic_pci_mem_write_2M(struct qlcnic_adapter *, u64 off, u64 data);
int qlcnic_pci_mem_read_2M(struct qlcnic_adapter *, u64 off, u64 *data); int qlcnic_pci_mem_read_2M(struct qlcnic_adapter *, u64 off, u64 *data);
...@@ -1345,7 +1345,7 @@ int qlcnic_rom_fast_read_words(struct qlcnic_adapter *adapter, int addr, ...@@ -1345,7 +1345,7 @@ int qlcnic_rom_fast_read_words(struct qlcnic_adapter *adapter, int addr,
int qlcnic_alloc_sw_resources(struct qlcnic_adapter *adapter); int qlcnic_alloc_sw_resources(struct qlcnic_adapter *adapter);
void qlcnic_free_sw_resources(struct qlcnic_adapter *adapter); void qlcnic_free_sw_resources(struct qlcnic_adapter *adapter);
void __iomem *qlcnic_get_ioaddr(struct qlcnic_adapter *, u32); void __iomem *qlcnic_get_ioaddr(struct qlcnic_hardware_context *, u32);
int qlcnic_alloc_hw_resources(struct qlcnic_adapter *adapter); int qlcnic_alloc_hw_resources(struct qlcnic_adapter *adapter);
void qlcnic_free_hw_resources(struct qlcnic_adapter *adapter); void qlcnic_free_hw_resources(struct qlcnic_adapter *adapter);
......
...@@ -816,55 +816,63 @@ enum { ...@@ -816,55 +816,63 @@ enum {
#define LSD(x) ((uint32_t)((uint64_t)(x))) #define LSD(x) ((uint32_t)((uint64_t)(x)))
#define MSD(x) ((uint32_t)((((uint64_t)(x)) >> 16) >> 16)) #define MSD(x) ((uint32_t)((((uint64_t)(x)) >> 16) >> 16))
#define QLCNIC_MS_CTRL 0x41000090
#define QLCNIC_MS_ADDR_LO 0x41000094
#define QLCNIC_MS_ADDR_HI 0x41000098
#define QLCNIC_MS_WRTDATA_LO 0x410000A0
#define QLCNIC_MS_WRTDATA_HI 0x410000A4
#define QLCNIC_MS_WRTDATA_ULO 0x410000B0
#define QLCNIC_MS_WRTDATA_UHI 0x410000B4
#define QLCNIC_MS_RDDATA_LO 0x410000A8
#define QLCNIC_MS_RDDATA_HI 0x410000AC
#define QLCNIC_MS_RDDATA_ULO 0x410000B8
#define QLCNIC_MS_RDDATA_UHI 0x410000BC
#define QLCNIC_TA_WRITE_ENABLE (TA_CTL_ENABLE | TA_CTL_WRITE)
#define QLCNIC_TA_WRITE_START (TA_CTL_START | TA_CTL_ENABLE | TA_CTL_WRITE)
#define QLCNIC_TA_START_ENABLE (TA_CTL_START | TA_CTL_ENABLE)
#define QLCNIC_LEGACY_INTR_CONFIG \ #define QLCNIC_LEGACY_INTR_CONFIG \
{ \ { \
{ \ { \
.int_vec_bit = PCIX_INT_VECTOR_BIT_F0, \ .int_vec_bit = PCIX_INT_VECTOR_BIT_F0, \
.tgt_status_reg = ISR_INT_TARGET_STATUS, \ .tgt_status_reg = ISR_INT_TARGET_STATUS, \
.tgt_mask_reg = ISR_INT_TARGET_MASK, \ .tgt_mask_reg = ISR_INT_TARGET_MASK, }, \
.pci_int_reg = ISR_MSI_INT_TRIGGER(0) }, \
\ \
{ \ { \
.int_vec_bit = PCIX_INT_VECTOR_BIT_F1, \ .int_vec_bit = PCIX_INT_VECTOR_BIT_F1, \
.tgt_status_reg = ISR_INT_TARGET_STATUS_F1, \ .tgt_status_reg = ISR_INT_TARGET_STATUS_F1, \
.tgt_mask_reg = ISR_INT_TARGET_MASK_F1, \ .tgt_mask_reg = ISR_INT_TARGET_MASK_F1, }, \
.pci_int_reg = ISR_MSI_INT_TRIGGER(1) }, \
\ \
{ \ { \
.int_vec_bit = PCIX_INT_VECTOR_BIT_F2, \ .int_vec_bit = PCIX_INT_VECTOR_BIT_F2, \
.tgt_status_reg = ISR_INT_TARGET_STATUS_F2, \ .tgt_status_reg = ISR_INT_TARGET_STATUS_F2, \
.tgt_mask_reg = ISR_INT_TARGET_MASK_F2, \ .tgt_mask_reg = ISR_INT_TARGET_MASK_F2, }, \
.pci_int_reg = ISR_MSI_INT_TRIGGER(2) }, \
\ \
{ \ { \
.int_vec_bit = PCIX_INT_VECTOR_BIT_F3, \ .int_vec_bit = PCIX_INT_VECTOR_BIT_F3, \
.tgt_status_reg = ISR_INT_TARGET_STATUS_F3, \ .tgt_status_reg = ISR_INT_TARGET_STATUS_F3, \
.tgt_mask_reg = ISR_INT_TARGET_MASK_F3, \ .tgt_mask_reg = ISR_INT_TARGET_MASK_F3, }, \
.pci_int_reg = ISR_MSI_INT_TRIGGER(3) }, \
\ \
{ \ { \
.int_vec_bit = PCIX_INT_VECTOR_BIT_F4, \ .int_vec_bit = PCIX_INT_VECTOR_BIT_F4, \
.tgt_status_reg = ISR_INT_TARGET_STATUS_F4, \ .tgt_status_reg = ISR_INT_TARGET_STATUS_F4, \
.tgt_mask_reg = ISR_INT_TARGET_MASK_F4, \ .tgt_mask_reg = ISR_INT_TARGET_MASK_F4, }, \
.pci_int_reg = ISR_MSI_INT_TRIGGER(4) }, \
\ \
{ \ { \
.int_vec_bit = PCIX_INT_VECTOR_BIT_F5, \ .int_vec_bit = PCIX_INT_VECTOR_BIT_F5, \
.tgt_status_reg = ISR_INT_TARGET_STATUS_F5, \ .tgt_status_reg = ISR_INT_TARGET_STATUS_F5, \
.tgt_mask_reg = ISR_INT_TARGET_MASK_F5, \ .tgt_mask_reg = ISR_INT_TARGET_MASK_F5, }, \
.pci_int_reg = ISR_MSI_INT_TRIGGER(5) }, \
\ \
{ \ { \
.int_vec_bit = PCIX_INT_VECTOR_BIT_F6, \ .int_vec_bit = PCIX_INT_VECTOR_BIT_F6, \
.tgt_status_reg = ISR_INT_TARGET_STATUS_F6, \ .tgt_status_reg = ISR_INT_TARGET_STATUS_F6, \
.tgt_mask_reg = ISR_INT_TARGET_MASK_F6, \ .tgt_mask_reg = ISR_INT_TARGET_MASK_F6, }, \
.pci_int_reg = ISR_MSI_INT_TRIGGER(6) }, \
\ \
{ \ { \
.int_vec_bit = PCIX_INT_VECTOR_BIT_F7, \ .int_vec_bit = PCIX_INT_VECTOR_BIT_F7, \
.tgt_status_reg = ISR_INT_TARGET_STATUS_F7, \ .tgt_status_reg = ISR_INT_TARGET_STATUS_F7, \
.tgt_mask_reg = ISR_INT_TARGET_MASK_F7, \ .tgt_mask_reg = ISR_INT_TARGET_MASK_F7, }, \
.pci_int_reg = ISR_MSI_INT_TRIGGER(7) }, \
} }
/* NIU REGS */ /* NIU REGS */
......
...@@ -283,32 +283,31 @@ static int qlcnic_enable_msix(struct qlcnic_adapter *adapter, u32 num_msix) ...@@ -283,32 +283,31 @@ static int qlcnic_enable_msix(struct qlcnic_adapter *adapter, u32 num_msix)
return err; return err;
} }
static void qlcnic_enable_msi_legacy(struct qlcnic_adapter *adapter) static void qlcnic_enable_msi_legacy(struct qlcnic_adapter *adapter)
{ {
u32 offset, mask_reg;
const struct qlcnic_legacy_intr_set *legacy_intrp; const struct qlcnic_legacy_intr_set *legacy_intrp;
struct qlcnic_hardware_context *ahw = adapter->ahw;
struct pci_dev *pdev = adapter->pdev; struct pci_dev *pdev = adapter->pdev;
if (use_msi && !pci_enable_msi(pdev)) { if (use_msi && !pci_enable_msi(pdev)) {
adapter->flags |= QLCNIC_MSI_ENABLED; adapter->flags |= QLCNIC_MSI_ENABLED;
adapter->tgt_status_reg = qlcnic_get_ioaddr(adapter, offset = msi_tgt_status[adapter->ahw->pci_func];
msi_tgt_status[adapter->ahw->pci_func]); adapter->tgt_status_reg = qlcnic_get_ioaddr(adapter->ahw,
offset);
dev_info(&pdev->dev, "using msi interrupts\n"); dev_info(&pdev->dev, "using msi interrupts\n");
adapter->msix_entries[0].vector = pdev->irq; adapter->msix_entries[0].vector = pdev->irq;
return; return;
} }
legacy_intrp = &legacy_intr[adapter->ahw->pci_func]; legacy_intrp = &legacy_intr[adapter->ahw->pci_func];
adapter->ahw->int_vec_bit = legacy_intrp->int_vec_bit; adapter->ahw->int_vec_bit = legacy_intrp->int_vec_bit;
adapter->tgt_status_reg = qlcnic_get_ioaddr(adapter, offset = legacy_intrp->tgt_status_reg;
legacy_intrp->tgt_status_reg); adapter->tgt_status_reg = qlcnic_get_ioaddr(ahw, offset);
adapter->tgt_mask_reg = qlcnic_get_ioaddr(adapter, mask_reg = legacy_intrp->tgt_mask_reg;
legacy_intrp->tgt_mask_reg); adapter->tgt_mask_reg = qlcnic_get_ioaddr(ahw, mask_reg);
adapter->isr_int_vec = qlcnic_get_ioaddr(adapter, ISR_INT_VECTOR); adapter->isr_int_vec = qlcnic_get_ioaddr(ahw, ISR_INT_VECTOR);
adapter->crb_int_state_reg = qlcnic_get_ioaddr(ahw, ISR_INT_STATE_REG);
adapter->crb_int_state_reg = qlcnic_get_ioaddr(adapter,
ISR_INT_STATE_REG);
dev_info(&pdev->dev, "using legacy interrupts\n"); dev_info(&pdev->dev, "using legacy interrupts\n");
adapter->msix_entries[0].vector = pdev->irq; adapter->msix_entries[0].vector = pdev->irq;
} }
...@@ -480,20 +479,32 @@ qlcnic_check_vf(struct qlcnic_adapter *adapter) ...@@ -480,20 +479,32 @@ qlcnic_check_vf(struct qlcnic_adapter *adapter)
adapter->nic_ops = &qlcnic_ops; adapter->nic_ops = &qlcnic_ops;
} }
static int #define QLCNIC_82XX_BAR0_LENGTH 0x00200000UL
qlcnic_setup_pci_map(struct qlcnic_adapter *adapter) static void qlcnic_get_bar_length(u32 dev_id, ulong *bar)
{
switch (dev_id) {
case PCI_DEVICE_ID_QLOGIC_QLE824X:
*bar = QLCNIC_82XX_BAR0_LENGTH;
break;
default:
*bar = 0;
}
}
static int qlcnic_setup_pci_map(struct pci_dev *pdev,
struct qlcnic_hardware_context *ahw)
{ {
u32 offset;
void __iomem *mem_ptr0 = NULL; void __iomem *mem_ptr0 = NULL;
resource_size_t mem_base; resource_size_t mem_base;
unsigned long mem_len, pci_len0 = 0; unsigned long mem_len, pci_len0 = 0, bar0_len;
struct pci_dev *pdev = adapter->pdev;
/* remap phys address */ /* remap phys address */
mem_base = pci_resource_start(pdev, 0); /* 0 is for BAR 0 */ mem_base = pci_resource_start(pdev, 0); /* 0 is for BAR 0 */
mem_len = pci_resource_len(pdev, 0); mem_len = pci_resource_len(pdev, 0);
if (mem_len == QLCNIC_PCI_2MB_SIZE) { qlcnic_get_bar_length(pdev->device, &bar0_len);
if (mem_len >= bar0_len) {
mem_ptr0 = pci_ioremap_bar(pdev, 0); mem_ptr0 = pci_ioremap_bar(pdev, 0);
if (mem_ptr0 == NULL) { if (mem_ptr0 == NULL) {
...@@ -506,15 +517,10 @@ qlcnic_setup_pci_map(struct qlcnic_adapter *adapter) ...@@ -506,15 +517,10 @@ qlcnic_setup_pci_map(struct qlcnic_adapter *adapter)
} }
dev_info(&pdev->dev, "%dMB memory map\n", (int)(mem_len>>20)); dev_info(&pdev->dev, "%dMB memory map\n", (int)(mem_len>>20));
ahw->pci_base0 = mem_ptr0;
adapter->ahw->pci_base0 = mem_ptr0; ahw->pci_len0 = pci_len0;
adapter->ahw->pci_len0 = pci_len0; offset = QLCNIC_PCIX_PS_REG(PCIX_OCM_WINDOW_REG(ahw->pci_func));
qlcnic_get_ioaddr(ahw, offset);
qlcnic_check_vf(adapter);
adapter->ahw->ocm_win_crb = qlcnic_get_ioaddr(adapter,
QLCNIC_PCIX_PS_REG(PCIX_OCM_WINDOW_REG(
adapter->ahw->pci_func)));
return 0; return 0;
} }
...@@ -1510,9 +1516,10 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -1510,9 +1516,10 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
spin_lock_init(&adapter->tx_clean_lock); spin_lock_init(&adapter->tx_clean_lock);
INIT_LIST_HEAD(&adapter->mac_list); INIT_LIST_HEAD(&adapter->mac_list);
err = qlcnic_setup_pci_map(adapter); err = qlcnic_setup_pci_map(pdev, adapter->ahw);
if (err) if (err)
goto err_out_free_hw; goto err_out_free_hw;
qlcnic_check_vf(adapter);
/* This will be reset for mezz cards */ /* This will be reset for mezz cards */
adapter->portnum = adapter->ahw->pci_func; adapter->portnum = adapter->ahw->pci_func;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment