[SCSI] bfa: Add support to configure min/max bandwidth for a pcifn

- Added support to configure minimum bandwidth for a pcifn.
- Minimum bandwith is guaranteed at per queue level.
- Added support to update pcifn bandwidth dynamically without
  a server reboot.

Signed-off-by: Krishna Gudipati <kgudipat@brocade.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
Krishna Gudipati 2012-09-21 17:26:50 -07:00 committed by James Bottomley
parent 7ace27ae28
commit 1a1297c644
7 changed files with 41 additions and 26 deletions

View File

@ -838,19 +838,20 @@ void
bfa_isr_enable(struct bfa_s *bfa) bfa_isr_enable(struct bfa_s *bfa)
{ {
u32 umsk; u32 umsk;
int pci_func = bfa_ioc_pcifn(&bfa->ioc); int port_id = bfa_ioc_portid(&bfa->ioc);
bfa_trc(bfa, pci_func); bfa_trc(bfa, bfa_ioc_pcifn(&bfa->ioc));
bfa_trc(bfa, port_id);
bfa_msix_ctrl_install(bfa); bfa_msix_ctrl_install(bfa);
if (bfa_asic_id_ct2(bfa->ioc.pcidev.device_id)) { if (bfa_asic_id_ct2(bfa->ioc.pcidev.device_id)) {
umsk = __HFN_INT_ERR_MASK_CT2; umsk = __HFN_INT_ERR_MASK_CT2;
umsk |= pci_func == 0 ? umsk |= port_id == 0 ?
__HFN_INT_FN0_MASK_CT2 : __HFN_INT_FN1_MASK_CT2; __HFN_INT_FN0_MASK_CT2 : __HFN_INT_FN1_MASK_CT2;
} else { } else {
umsk = __HFN_INT_ERR_MASK; umsk = __HFN_INT_ERR_MASK;
umsk |= pci_func == 0 ? __HFN_INT_FN0_MASK : __HFN_INT_FN1_MASK; umsk |= port_id == 0 ? __HFN_INT_FN0_MASK : __HFN_INT_FN1_MASK;
} }
writel(umsk, bfa->iocfc.bfa_regs.intr_status); writel(umsk, bfa->iocfc.bfa_regs.intr_status);

View File

@ -190,6 +190,7 @@ enum bfa_status {
BFA_STATUS_TOPOLOGY_LOOP = 230, /* Topology is set to Loop */ BFA_STATUS_TOPOLOGY_LOOP = 230, /* Topology is set to Loop */
BFA_STATUS_LOOP_UNSUPP_MEZZ = 231, /* Loop topology is not supported BFA_STATUS_LOOP_UNSUPP_MEZZ = 231, /* Loop topology is not supported
* on mezz cards */ * on mezz cards */
BFA_STATUS_INVALID_BW = 233, /* Invalid bandwidth value */
BFA_STATUS_QOS_BW_INVALID = 234, /* Invalid QOS bandwidth BFA_STATUS_QOS_BW_INVALID = 234, /* Invalid QOS bandwidth
* configuration */ * configuration */
BFA_STATUS_DPORT_ENABLED = 235, /* D-port mode is already enabled */ BFA_STATUS_DPORT_ENABLED = 235, /* D-port mode is already enabled */
@ -749,7 +750,8 @@ struct bfa_ablk_cfg_pf_s {
u8 rsvd[1]; u8 rsvd[1];
u16 num_qpairs; u16 num_qpairs;
u16 num_vectors; u16 num_vectors;
u32 bw; u16 bw_min;
u16 bw_max;
}; };
struct bfa_ablk_cfg_port_s { struct bfa_ablk_cfg_port_s {

View File

@ -3019,7 +3019,6 @@ bfa_ablk_config_swap(struct bfa_ablk_cfg_s *cfg)
struct bfa_ablk_cfg_inst_s *cfg_inst; struct bfa_ablk_cfg_inst_s *cfg_inst;
int i, j; int i, j;
u16 be16; u16 be16;
u32 be32;
for (i = 0; i < BFA_ABLK_MAX; i++) { for (i = 0; i < BFA_ABLK_MAX; i++) {
cfg_inst = &cfg->inst[i]; cfg_inst = &cfg->inst[i];
@ -3030,8 +3029,10 @@ bfa_ablk_config_swap(struct bfa_ablk_cfg_s *cfg)
cfg_inst->pf_cfg[j].num_qpairs = be16_to_cpu(be16); cfg_inst->pf_cfg[j].num_qpairs = be16_to_cpu(be16);
be16 = cfg_inst->pf_cfg[j].num_vectors; be16 = cfg_inst->pf_cfg[j].num_vectors;
cfg_inst->pf_cfg[j].num_vectors = be16_to_cpu(be16); cfg_inst->pf_cfg[j].num_vectors = be16_to_cpu(be16);
be32 = cfg_inst->pf_cfg[j].bw; be16 = cfg_inst->pf_cfg[j].bw_min;
cfg_inst->pf_cfg[j].bw = be16_to_cpu(be32); cfg_inst->pf_cfg[j].bw_min = be16_to_cpu(be16);
be16 = cfg_inst->pf_cfg[j].bw_max;
cfg_inst->pf_cfg[j].bw_max = be16_to_cpu(be16);
} }
} }
} }
@ -3173,7 +3174,8 @@ bfa_ablk_query(struct bfa_ablk_s *ablk, struct bfa_ablk_cfg_s *ablk_cfg,
bfa_status_t bfa_status_t
bfa_ablk_pf_create(struct bfa_ablk_s *ablk, u16 *pcifn, bfa_ablk_pf_create(struct bfa_ablk_s *ablk, u16 *pcifn,
u8 port, enum bfi_pcifn_class personality, int bw, u8 port, enum bfi_pcifn_class personality,
u16 bw_min, u16 bw_max,
bfa_ablk_cbfn_t cbfn, void *cbarg) bfa_ablk_cbfn_t cbfn, void *cbarg)
{ {
struct bfi_ablk_h2i_pf_req_s *m; struct bfi_ablk_h2i_pf_req_s *m;
@ -3197,7 +3199,8 @@ bfa_ablk_pf_create(struct bfa_ablk_s *ablk, u16 *pcifn,
bfi_h2i_set(m->mh, BFI_MC_ABLK, BFI_ABLK_H2I_PF_CREATE, bfi_h2i_set(m->mh, BFI_MC_ABLK, BFI_ABLK_H2I_PF_CREATE,
bfa_ioc_portid(ablk->ioc)); bfa_ioc_portid(ablk->ioc));
m->pers = cpu_to_be16((u16)personality); m->pers = cpu_to_be16((u16)personality);
m->bw = cpu_to_be32(bw); m->bw_min = cpu_to_be16(bw_min);
m->bw_max = cpu_to_be16(bw_max);
m->port = port; m->port = port;
bfa_ioc_mbox_queue(ablk->ioc, &ablk->mb); bfa_ioc_mbox_queue(ablk->ioc, &ablk->mb);
@ -3297,8 +3300,8 @@ bfa_ablk_port_config(struct bfa_ablk_s *ablk, int port, enum bfa_mode_s mode,
} }
bfa_status_t bfa_status_t
bfa_ablk_pf_update(struct bfa_ablk_s *ablk, int pcifn, int bw, bfa_ablk_pf_update(struct bfa_ablk_s *ablk, int pcifn, u16 bw_min,
bfa_ablk_cbfn_t cbfn, void *cbarg) u16 bw_max, bfa_ablk_cbfn_t cbfn, void *cbarg)
{ {
struct bfi_ablk_h2i_pf_req_s *m; struct bfi_ablk_h2i_pf_req_s *m;
@ -3320,7 +3323,8 @@ bfa_ablk_pf_update(struct bfa_ablk_s *ablk, int pcifn, int bw,
bfi_h2i_set(m->mh, BFI_MC_ABLK, BFI_ABLK_H2I_PF_UPDATE, bfi_h2i_set(m->mh, BFI_MC_ABLK, BFI_ABLK_H2I_PF_UPDATE,
bfa_ioc_portid(ablk->ioc)); bfa_ioc_portid(ablk->ioc));
m->pcifn = (u8)pcifn; m->pcifn = (u8)pcifn;
m->bw = cpu_to_be32(bw); m->bw_min = cpu_to_be16(bw_min);
m->bw_max = cpu_to_be16(bw_max);
bfa_ioc_mbox_queue(ablk->ioc, &ablk->mb); bfa_ioc_mbox_queue(ablk->ioc, &ablk->mb);
return BFA_STATUS_OK; return BFA_STATUS_OK;

View File

@ -889,12 +889,12 @@ bfa_status_t bfa_ablk_port_config(struct bfa_ablk_s *ablk, int port,
enum bfa_mode_s mode, int max_pf, int max_vf, enum bfa_mode_s mode, int max_pf, int max_vf,
bfa_ablk_cbfn_t cbfn, void *cbarg); bfa_ablk_cbfn_t cbfn, void *cbarg);
bfa_status_t bfa_ablk_pf_create(struct bfa_ablk_s *ablk, u16 *pcifn, bfa_status_t bfa_ablk_pf_create(struct bfa_ablk_s *ablk, u16 *pcifn,
u8 port, enum bfi_pcifn_class personality, int bw, u8 port, enum bfi_pcifn_class personality,
bfa_ablk_cbfn_t cbfn, void *cbarg); u16 bw_min, u16 bw_max, bfa_ablk_cbfn_t cbfn, void *cbarg);
bfa_status_t bfa_ablk_pf_delete(struct bfa_ablk_s *ablk, int pcifn, bfa_status_t bfa_ablk_pf_delete(struct bfa_ablk_s *ablk, int pcifn,
bfa_ablk_cbfn_t cbfn, void *cbarg); bfa_ablk_cbfn_t cbfn, void *cbarg);
bfa_status_t bfa_ablk_pf_update(struct bfa_ablk_s *ablk, int pcifn, int bw, bfa_status_t bfa_ablk_pf_update(struct bfa_ablk_s *ablk, int pcifn,
bfa_ablk_cbfn_t cbfn, void *cbarg); u16 bw_min, u16 bw_max, bfa_ablk_cbfn_t cbfn, void *cbarg);
bfa_status_t bfa_ablk_optrom_en(struct bfa_ablk_s *ablk, bfa_status_t bfa_ablk_optrom_en(struct bfa_ablk_s *ablk,
bfa_ablk_cbfn_t cbfn, void *cbarg); bfa_ablk_cbfn_t cbfn, void *cbarg);
bfa_status_t bfa_ablk_optrom_dis(struct bfa_ablk_s *ablk, bfa_status_t bfa_ablk_optrom_dis(struct bfa_ablk_s *ablk,

View File

@ -33,7 +33,7 @@ bfad_iocmd_ioc_enable(struct bfad_s *bfad, void *cmd)
/* If IOC is not in disabled state - return */ /* If IOC is not in disabled state - return */
if (!bfa_ioc_is_disabled(&bfad->bfa.ioc)) { if (!bfa_ioc_is_disabled(&bfad->bfa.ioc)) {
spin_unlock_irqrestore(&bfad->bfad_lock, flags); spin_unlock_irqrestore(&bfad->bfad_lock, flags);
iocmd->status = BFA_STATUS_IOC_FAILURE; iocmd->status = BFA_STATUS_OK;
return rc; return rc;
} }
@ -54,6 +54,12 @@ bfad_iocmd_ioc_disable(struct bfad_s *bfad, void *cmd)
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&bfad->bfad_lock, flags); spin_lock_irqsave(&bfad->bfad_lock, flags);
if (bfa_ioc_is_disabled(&bfad->bfa.ioc)) {
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
iocmd->status = BFA_STATUS_OK;
return rc;
}
if (bfad->disable_active) { if (bfad->disable_active) {
spin_unlock_irqrestore(&bfad->bfad_lock, flags); spin_unlock_irqrestore(&bfad->bfad_lock, flags);
return -EBUSY; return -EBUSY;
@ -1191,8 +1197,8 @@ bfad_iocmd_pcifn_create(struct bfad_s *bfad, void *cmd)
spin_lock_irqsave(&bfad->bfad_lock, flags); spin_lock_irqsave(&bfad->bfad_lock, flags);
iocmd->status = bfa_ablk_pf_create(&bfad->bfa.modules.ablk, iocmd->status = bfa_ablk_pf_create(&bfad->bfa.modules.ablk,
&iocmd->pcifn_id, iocmd->port, &iocmd->pcifn_id, iocmd->port,
iocmd->pcifn_class, iocmd->bandwidth, iocmd->pcifn_class, iocmd->bw_min,
bfad_hcb_comp, &fcomp); iocmd->bw_max, bfad_hcb_comp, &fcomp);
spin_unlock_irqrestore(&bfad->bfad_lock, flags); spin_unlock_irqrestore(&bfad->bfad_lock, flags);
if (iocmd->status != BFA_STATUS_OK) if (iocmd->status != BFA_STATUS_OK)
goto out; goto out;
@ -1235,8 +1241,8 @@ bfad_iocmd_pcifn_bw(struct bfad_s *bfad, void *cmd)
init_completion(&fcomp.comp); init_completion(&fcomp.comp);
spin_lock_irqsave(&bfad->bfad_lock, flags); spin_lock_irqsave(&bfad->bfad_lock, flags);
iocmd->status = bfa_ablk_pf_update(&bfad->bfa.modules.ablk, iocmd->status = bfa_ablk_pf_update(&bfad->bfa.modules.ablk,
iocmd->pcifn_id, iocmd->bandwidth, iocmd->pcifn_id, iocmd->bw_min,
bfad_hcb_comp, &fcomp); iocmd->bw_max, bfad_hcb_comp, &fcomp);
spin_unlock_irqrestore(&bfad->bfad_lock, flags); spin_unlock_irqrestore(&bfad->bfad_lock, flags);
bfa_trc(bfad, iocmd->status); bfa_trc(bfad, iocmd->status);
if (iocmd->status != BFA_STATUS_OK) if (iocmd->status != BFA_STATUS_OK)
@ -2122,7 +2128,7 @@ bfad_iocmd_boot_cfg(struct bfad_s *bfad, void *cmd)
init_completion(&fcomp.comp); init_completion(&fcomp.comp);
spin_lock_irqsave(&bfad->bfad_lock, flags); spin_lock_irqsave(&bfad->bfad_lock, flags);
iocmd->status = bfa_flash_update_part(BFA_FLASH(&bfad->bfa), iocmd->status = bfa_flash_update_part(BFA_FLASH(&bfad->bfa),
BFA_FLASH_PART_BOOT, PCI_FUNC(bfad->pcidev->devfn), BFA_FLASH_PART_BOOT, bfad->bfa.ioc.port_id,
&iocmd->cfg, sizeof(struct bfa_boot_cfg_s), 0, &iocmd->cfg, sizeof(struct bfa_boot_cfg_s), 0,
bfad_hcb_comp, &fcomp); bfad_hcb_comp, &fcomp);
spin_unlock_irqrestore(&bfad->bfad_lock, flags); spin_unlock_irqrestore(&bfad->bfad_lock, flags);
@ -2144,7 +2150,7 @@ bfad_iocmd_boot_query(struct bfad_s *bfad, void *cmd)
init_completion(&fcomp.comp); init_completion(&fcomp.comp);
spin_lock_irqsave(&bfad->bfad_lock, flags); spin_lock_irqsave(&bfad->bfad_lock, flags);
iocmd->status = bfa_flash_read_part(BFA_FLASH(&bfad->bfa), iocmd->status = bfa_flash_read_part(BFA_FLASH(&bfad->bfa),
BFA_FLASH_PART_BOOT, PCI_FUNC(bfad->pcidev->devfn), BFA_FLASH_PART_BOOT, bfad->bfa.ioc.port_id,
&iocmd->cfg, sizeof(struct bfa_boot_cfg_s), 0, &iocmd->cfg, sizeof(struct bfa_boot_cfg_s), 0,
bfad_hcb_comp, &fcomp); bfad_hcb_comp, &fcomp);
spin_unlock_irqrestore(&bfad->bfad_lock, flags); spin_unlock_irqrestore(&bfad->bfad_lock, flags);

View File

@ -469,7 +469,8 @@ struct bfa_bsg_pcifn_s {
bfa_status_t status; bfa_status_t status;
u16 bfad_num; u16 bfad_num;
u16 pcifn_id; u16 pcifn_id;
u32 bandwidth; u16 bw_min;
u16 bw_max;
u8 port; u8 port;
enum bfi_pcifn_class pcifn_class; enum bfi_pcifn_class pcifn_class;
u8 rsvd[1]; u8 rsvd[1];

View File

@ -690,7 +690,8 @@ struct bfi_ablk_h2i_pf_req_s {
u8 pcifn; u8 pcifn;
u8 port; u8 port;
u16 pers; u16 pers;
u32 bw; u16 bw_min; /* percent BW @ max speed */
u16 bw_max; /* percent BW @ max speed */
}; };
/* BFI_ABLK_H2I_OPTROM_ENABLE, BFI_ABLK_H2I_OPTROM_DISABLE */ /* BFI_ABLK_H2I_OPTROM_ENABLE, BFI_ABLK_H2I_OPTROM_DISABLE */