Print this page
3500 Support LSI SAS2008 (Falcon) Skinny FW for mr_sas(7D)
*** 13,23 ****
--- 13,27 ----
* Manju R
* Rasheed
* Shakeel Bukhari
*/
+ /*
+ * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
+ */
+
#include <sys/types.h>
#include <sys/file.h>
#include <sys/atomic.h>
#include <sys/scsi/scsi.h>
#include <sys/byteorder.h>
*** 44,55 ****
extern uint32_t mrsas_tbolt_max_cap_maxxfer;
extern struct ddi_device_acc_attr endian_attr;
extern int debug_level_g;
extern unsigned int enable_fp;
volatile int dump_io_wait_time = 90;
- extern void
- io_timeout_checker(void *arg);
extern volatile int debug_timeout_g;
extern int mrsas_issue_pending_cmds(struct mrsas_instance *);
extern int mrsas_complete_pending_cmds(struct mrsas_instance *instance);
extern void push_pending_mfi_pkt(struct mrsas_instance *,
struct mrsas_cmd *);
--- 48,57 ----
*** 1880,1979 ****
}
return (cmd);
}
- /*
- * mrsas_tbolt_tran_init_pkt - allocate & initialize a scsi_pkt structure
- * @ap:
- * @pkt:
- * @bp:
- * @cmdlen:
- * @statuslen:
- * @tgtlen:
- * @flags:
- * @callback:
- *
- * The tran_init_pkt() entry point allocates and initializes a scsi_pkt
- * structure and DMA resources for a target driver request. The
- * tran_init_pkt() entry point is called when the target driver calls the
- * SCSA function scsi_init_pkt(). Each call of the tran_init_pkt() entry point
- * is a request to perform one or more of three possible services:
- * - allocation and initialization of a scsi_pkt structure
- * - allocation of DMA resources for data transfer
- * - reallocation of DMA resources for the next portion of the data transfer
- */
- struct scsi_pkt *
- mrsas_tbolt_tran_init_pkt(struct scsi_address *ap,
- register struct scsi_pkt *pkt,
- struct buf *bp, int cmdlen, int statuslen, int tgtlen,
- int flags, int (*callback)(), caddr_t arg)
- {
- struct scsa_cmd *acmd;
- struct mrsas_instance *instance;
- struct scsi_pkt *new_pkt;
-
- instance = ADDR2MR(ap);
-
- /* step #1 : pkt allocation */
- if (pkt == NULL) {
- pkt = scsi_hba_pkt_alloc(instance->dip, ap, cmdlen, statuslen,
- tgtlen, sizeof (struct scsa_cmd), callback, arg);
- if (pkt == NULL) {
- return (NULL);
- }
-
- acmd = PKT2CMD(pkt);
-
- /*
- * Initialize the new pkt - we redundantly initialize
- * all the fields for illustrative purposes.
- */
- acmd->cmd_pkt = pkt;
- acmd->cmd_flags = 0;
- acmd->cmd_scblen = statuslen;
- acmd->cmd_cdblen = cmdlen;
- acmd->cmd_dmahandle = NULL;
- acmd->cmd_ncookies = 0;
- acmd->cmd_cookie = 0;
- acmd->cmd_cookiecnt = 0;
- acmd->cmd_nwin = 0;
-
- pkt->pkt_address = *ap;
- pkt->pkt_comp = (void (*)())NULL;
- pkt->pkt_flags = 0;
- pkt->pkt_time = 0;
- pkt->pkt_resid = 0;
- pkt->pkt_state = 0;
- pkt->pkt_statistics = 0;
- pkt->pkt_reason = 0;
- new_pkt = pkt;
- } else {
- acmd = PKT2CMD(pkt);
- new_pkt = NULL;
- }
-
- /* step #2 : dma allocation/move */
- if (bp && bp->b_bcount != 0) {
- if (acmd->cmd_dmahandle == NULL) {
- if (mrsas_dma_alloc(instance, pkt, bp, flags,
- callback) == DDI_FAILURE) {
- if (new_pkt) {
- scsi_hba_pkt_free(ap, new_pkt);
- }
- return ((struct scsi_pkt *)NULL);
- }
- } else {
- if (mrsas_dma_move(instance, pkt, bp) == DDI_FAILURE) {
- return ((struct scsi_pkt *)NULL);
- }
- }
- }
- return (pkt);
- }
-
-
uint32_t
tbolt_read_fw_status_reg(struct mrsas_instance *instance)
{
return ((uint32_t)RD_OB_SCRATCH_PAD_0(instance));
}
--- 1882,1891 ----
*** 3630,3639 ****
--- 3542,3559 ----
return (ret);
}
#ifdef PDSUPPORT
+ /*
+ * Even though these functions were originally intended for 2208 only, it
+ * turns out they're useful for "Skinny" support as well. In a perfect world,
+ * these two functions would be either in mr_sas.c, or in their own new source
+ * file. Since this driver needs some cleanup anyway, keep this portion in
+ * mind as well.
+ */
+
int
mrsas_tbolt_config_pd(struct mrsas_instance *instance, uint16_t tgt,
uint8_t lun, dev_info_t **ldip)
{
struct scsi_device *sd;
*** 3692,3702 ****
if (sd->sd_inq) {
kmem_free(sd->sd_inq, SUN_INQSIZE);
sd->sd_inq = (struct scsi_inquiry *)NULL;
}
kmem_free(sd, sizeof (struct scsi_device));
- rval = NDI_SUCCESS;
} else {
con_log(CL_ANN1, (CE_NOTE,
"Device not supported: tgt %d lun %d dtype %d",
tgt, lun, dtype));
rval = NDI_FAILURE;
--- 3612,3621 ----
*** 3714,3724 ****
--- 3633,3648 ----
{
struct mrsas_cmd *cmd;
struct mrsas_dcmd_frame *dcmd;
dma_obj_t dcmd_dma_obj;
+ ASSERT(instance->tbolt || instance->skinny);
+
+ if (instance->tbolt)
cmd = get_raid_msg_pkt(instance);
+ else
+ cmd = mrsas_get_mfi_pkt(instance);
if (!cmd) {
con_log(CL_ANN1,
(CE_WARN, "Failed to get a cmd for get pd info"));
return;
*** 3759,3776 ****
dcmd_dma_obj.dma_cookie[0].dmac_address);
cmd->sync_cmd = MRSAS_TRUE;
cmd->frame_count = 1;
! if (instance->tbolt) {
mr_sas_tbolt_build_mfi_cmd(instance, cmd);
- }
instance->func_ptr->issue_cmd_in_sync_mode(instance, cmd);
ddi_rep_get8(cmd->frame_dma_obj.acc_handle, (uint8_t *)pds,
(uint8_t *)dcmd_dma_obj.buffer, sizeof (struct mrsas_tbolt_pd_info),
DDI_DEV_AUTOINCR);
(void) mrsas_free_dma_obj(instance, dcmd_dma_obj);
return_raid_msg_pkt(instance, cmd);
}
#endif
--- 3683,3703 ----
dcmd_dma_obj.dma_cookie[0].dmac_address);
cmd->sync_cmd = MRSAS_TRUE;
cmd->frame_count = 1;
! if (instance->tbolt)
mr_sas_tbolt_build_mfi_cmd(instance, cmd);
instance->func_ptr->issue_cmd_in_sync_mode(instance, cmd);
ddi_rep_get8(cmd->frame_dma_obj.acc_handle, (uint8_t *)pds,
(uint8_t *)dcmd_dma_obj.buffer, sizeof (struct mrsas_tbolt_pd_info),
DDI_DEV_AUTOINCR);
(void) mrsas_free_dma_obj(instance, dcmd_dma_obj);
+
+ if (instance->tbolt)
return_raid_msg_pkt(instance, cmd);
+ else
+ mrsas_return_mfi_pkt(instance, cmd);
}
#endif