Loading drivers/scsi/hpsa.c +50 −0 Original line number Diff line number Diff line Loading @@ -5291,6 +5291,10 @@ static void hpsa_free_cmd_pool(struct ctlr_info *h) pci_free_consistent(h->pdev, h->nr_cmds * sizeof(struct CommandList), h->cmd_pool, h->cmd_pool_dhandle); if (h->ioaccel2_cmd_pool) pci_free_consistent(h->pdev, h->nr_cmds * sizeof(*h->ioaccel2_cmd_pool), h->ioaccel2_cmd_pool, h->ioaccel2_cmd_pool_dhandle); if (h->errinfo_pool) pci_free_consistent(h->pdev, h->nr_cmds * sizeof(struct ErrorInfo), Loading Loading @@ -5829,6 +5833,7 @@ static void hpsa_remove_one(struct pci_dev *pdev) kfree(h->cmd_pool_bits); kfree(h->blockFetchTable); kfree(h->ioaccel1_blockFetchTable); kfree(h->ioaccel2_blockFetchTable); kfree(h->hba_inquiry_data); pci_disable_device(pdev); pci_release_regions(pdev); Loading Loading @@ -6048,6 +6053,44 @@ static int hpsa_alloc_ioaccel_cmd_and_bft(struct ctlr_info *h) return 1; } static int ioaccel2_alloc_cmds_and_bft(struct ctlr_info *h) { /* Allocate ioaccel2 mode command blocks and block fetch table */ h->ioaccel_maxsg = readl(&(h->cfgtable->io_accel_max_embedded_sg_count)); if (h->ioaccel_maxsg > IOACCEL2_MAXSGENTRIES) h->ioaccel_maxsg = IOACCEL2_MAXSGENTRIES; #define IOACCEL2_COMMANDLIST_ALIGNMENT 128 BUILD_BUG_ON(sizeof(struct io_accel2_cmd) % IOACCEL2_COMMANDLIST_ALIGNMENT); h->ioaccel2_cmd_pool = pci_alloc_consistent(h->pdev, h->nr_cmds * sizeof(*h->ioaccel2_cmd_pool), &(h->ioaccel2_cmd_pool_dhandle)); h->ioaccel2_blockFetchTable = kmalloc(((h->ioaccel_maxsg + 1) * sizeof(u32)), GFP_KERNEL); if ((h->ioaccel2_cmd_pool == NULL) || (h->ioaccel2_blockFetchTable == NULL)) goto clean_up; memset(h->ioaccel2_cmd_pool, 0, h->nr_cmds * sizeof(*h->ioaccel2_cmd_pool)); return 0; clean_up: if (h->ioaccel2_cmd_pool) pci_free_consistent(h->pdev, h->nr_cmds * sizeof(*h->ioaccel2_cmd_pool), h->ioaccel2_cmd_pool, h->ioaccel2_cmd_pool_dhandle); kfree(h->ioaccel2_blockFetchTable); return 1; } static void hpsa_put_ctlr_into_performant_mode(struct ctlr_info *h) { u32 trans_support; Loading @@ -6064,6 +6107,13 @@ static void hpsa_put_ctlr_into_performant_mode(struct ctlr_info *h) CFGTBL_Trans_enable_directed_msix; if (hpsa_alloc_ioaccel_cmd_and_bft(h)) goto clean_up; } else { if (trans_support & CFGTBL_Trans_io_accel2) { transMethod |= CFGTBL_Trans_io_accel2 | CFGTBL_Trans_enable_directed_msix; if (ioaccel2_alloc_cmds_and_bft(h)) goto clean_up; } } /* TODO, check that this next line h->nreply_queues is correct */ Loading drivers/scsi/hpsa.h +3 −0 Original line number Diff line number Diff line Loading @@ -105,6 +105,8 @@ struct ctlr_info { dma_addr_t cmd_pool_dhandle; struct io_accel1_cmd *ioaccel_cmd_pool; dma_addr_t ioaccel_cmd_pool_dhandle; struct io_accel2_cmd *ioaccel2_cmd_pool; dma_addr_t ioaccel2_cmd_pool_dhandle; struct ErrorInfo *errinfo_pool; dma_addr_t errinfo_pool_dhandle; unsigned long *cmd_pool_bits; Loading Loading @@ -139,6 +141,7 @@ struct ctlr_info { dma_addr_t reply_pool_dhandle; u32 *blockFetchTable; u32 *ioaccel1_blockFetchTable; u32 *ioaccel2_blockFetchTable; unsigned char *hba_inquiry_data; u32 driver_support; u32 fw_support; Loading Loading
drivers/scsi/hpsa.c +50 −0 Original line number Diff line number Diff line Loading @@ -5291,6 +5291,10 @@ static void hpsa_free_cmd_pool(struct ctlr_info *h) pci_free_consistent(h->pdev, h->nr_cmds * sizeof(struct CommandList), h->cmd_pool, h->cmd_pool_dhandle); if (h->ioaccel2_cmd_pool) pci_free_consistent(h->pdev, h->nr_cmds * sizeof(*h->ioaccel2_cmd_pool), h->ioaccel2_cmd_pool, h->ioaccel2_cmd_pool_dhandle); if (h->errinfo_pool) pci_free_consistent(h->pdev, h->nr_cmds * sizeof(struct ErrorInfo), Loading Loading @@ -5829,6 +5833,7 @@ static void hpsa_remove_one(struct pci_dev *pdev) kfree(h->cmd_pool_bits); kfree(h->blockFetchTable); kfree(h->ioaccel1_blockFetchTable); kfree(h->ioaccel2_blockFetchTable); kfree(h->hba_inquiry_data); pci_disable_device(pdev); pci_release_regions(pdev); Loading Loading @@ -6048,6 +6053,44 @@ static int hpsa_alloc_ioaccel_cmd_and_bft(struct ctlr_info *h) return 1; } static int ioaccel2_alloc_cmds_and_bft(struct ctlr_info *h) { /* Allocate ioaccel2 mode command blocks and block fetch table */ h->ioaccel_maxsg = readl(&(h->cfgtable->io_accel_max_embedded_sg_count)); if (h->ioaccel_maxsg > IOACCEL2_MAXSGENTRIES) h->ioaccel_maxsg = IOACCEL2_MAXSGENTRIES; #define IOACCEL2_COMMANDLIST_ALIGNMENT 128 BUILD_BUG_ON(sizeof(struct io_accel2_cmd) % IOACCEL2_COMMANDLIST_ALIGNMENT); h->ioaccel2_cmd_pool = pci_alloc_consistent(h->pdev, h->nr_cmds * sizeof(*h->ioaccel2_cmd_pool), &(h->ioaccel2_cmd_pool_dhandle)); h->ioaccel2_blockFetchTable = kmalloc(((h->ioaccel_maxsg + 1) * sizeof(u32)), GFP_KERNEL); if ((h->ioaccel2_cmd_pool == NULL) || (h->ioaccel2_blockFetchTable == NULL)) goto clean_up; memset(h->ioaccel2_cmd_pool, 0, h->nr_cmds * sizeof(*h->ioaccel2_cmd_pool)); return 0; clean_up: if (h->ioaccel2_cmd_pool) pci_free_consistent(h->pdev, h->nr_cmds * sizeof(*h->ioaccel2_cmd_pool), h->ioaccel2_cmd_pool, h->ioaccel2_cmd_pool_dhandle); kfree(h->ioaccel2_blockFetchTable); return 1; } static void hpsa_put_ctlr_into_performant_mode(struct ctlr_info *h) { u32 trans_support; Loading @@ -6064,6 +6107,13 @@ static void hpsa_put_ctlr_into_performant_mode(struct ctlr_info *h) CFGTBL_Trans_enable_directed_msix; if (hpsa_alloc_ioaccel_cmd_and_bft(h)) goto clean_up; } else { if (trans_support & CFGTBL_Trans_io_accel2) { transMethod |= CFGTBL_Trans_io_accel2 | CFGTBL_Trans_enable_directed_msix; if (ioaccel2_alloc_cmds_and_bft(h)) goto clean_up; } } /* TODO, check that this next line h->nreply_queues is correct */ Loading
drivers/scsi/hpsa.h +3 −0 Original line number Diff line number Diff line Loading @@ -105,6 +105,8 @@ struct ctlr_info { dma_addr_t cmd_pool_dhandle; struct io_accel1_cmd *ioaccel_cmd_pool; dma_addr_t ioaccel_cmd_pool_dhandle; struct io_accel2_cmd *ioaccel2_cmd_pool; dma_addr_t ioaccel2_cmd_pool_dhandle; struct ErrorInfo *errinfo_pool; dma_addr_t errinfo_pool_dhandle; unsigned long *cmd_pool_bits; Loading Loading @@ -139,6 +141,7 @@ struct ctlr_info { dma_addr_t reply_pool_dhandle; u32 *blockFetchTable; u32 *ioaccel1_blockFetchTable; u32 *ioaccel2_blockFetchTable; unsigned char *hba_inquiry_data; u32 driver_support; u32 fw_support; Loading