tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master head: b86a6a241b7c60ca7a6ca4fb3c0d2aedbbf2c1b6 commit: c25eb70a10243c1ad24e74375aceb65ab8951e93 [5171/7050] scsi: qla2xxx: Convert MAKE_HANDLE() from a define into an inline function reproduce: # apt-get install sparse # sparse version: v0.6.1-174-g094d5a94-dirty git checkout c25eb70a10243c1ad24e74375aceb65ab8951e93 make ARCH=x86_64 allmodconfig make C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' If you fix the issue, kindly add following tag Reported-by: kbuild test robot <lkp@xxxxxxxxx> sparse warnings: (new ones prefixed by >>) drivers/scsi/qla2xxx/qla_iocb.c:2473:18: sparse: got restricted __le16 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:2474:18: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [usertype] mb7 @@ got resunsigned short [usertype] mb7 @@ drivers/scsi/qla2xxx/qla_iocb.c:2474:18: sparse: expected unsigned short [usertype] mb7 drivers/scsi/qla2xxx/qla_iocb.c:2474:18: sparse: got restricted __le16 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:2475:18: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [usertype] mb9 @@ got resunsigned short [usertype] mb9 @@ drivers/scsi/qla2xxx/qla_iocb.c:2475:18: sparse: expected unsigned short [usertype] mb9 drivers/scsi/qla2xxx/qla_iocb.c:2475:18: sparse: got restricted __le16 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:2495:27: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [usertype] nport_handle @@ got resunsigned short [usertype] nport_handle @@ drivers/scsi/qla2xxx/qla_iocb.c:2495:27: sparse: expected unsigned short [usertype] nport_handle drivers/scsi/qla2xxx/qla_iocb.c:2495:27: sparse: got restricted __le16 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:2496:22: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [usertype] timeout @@ got resunsigned short [usertype] timeout @@ drivers/scsi/qla2xxx/qla_iocb.c:2496:22: sparse: expected unsigned short [usertype] timeout drivers/scsi/qla2xxx/qla_iocb.c:2496:22: sparse: got restricted __le16 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:2497:28: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned int [usertype] control_flags @@ got restrunsigned int [usertype] control_flags @@ drivers/scsi/qla2xxx/qla_iocb.c:2497:28: sparse: expected unsigned int [usertype] control_flags drivers/scsi/qla2xxx/qla_iocb.c:2497:28: sparse: got restricted __le32 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:2682:32: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [usertype] nport_handle @@ got resunsigned short [usertype] nport_handle @@ drivers/scsi/qla2xxx/qla_iocb.c:2682:32: sparse: expected unsigned short [usertype] nport_handle drivers/scsi/qla2xxx/qla_iocb.c:2682:32: sparse: got restricted __le16 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3025:32: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [usertype] nport_handle @@ got resunsigned short [usertype] nport_handle @@ drivers/scsi/qla2xxx/qla_iocb.c:3025:32: sparse: expected unsigned short [usertype] nport_handle drivers/scsi/qla2xxx/qla_iocb.c:3025:32: sparse: got restricted __le16 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3026:32: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [usertype] tx_dsd_count @@ got resunsigned short [usertype] tx_dsd_count @@ drivers/scsi/qla2xxx/qla_iocb.c:3026:32: sparse: expected unsigned short [usertype] tx_dsd_count drivers/scsi/qla2xxx/qla_iocb.c:3026:32: sparse: got restricted __le16 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3029:32: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [usertype] rx_dsd_count @@ got resunsigned short [usertype] rx_dsd_count @@ drivers/scsi/qla2xxx/qla_iocb.c:3029:32: sparse: expected unsigned short [usertype] rx_dsd_count drivers/scsi/qla2xxx/qla_iocb.c:3029:32: sparse: got restricted __le16 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3074:9: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [usertype] extended @@ got resunsigned short [usertype] extended @@ drivers/scsi/qla2xxx/qla_iocb.c:3074:9: sparse: expected unsigned short [usertype] extended drivers/scsi/qla2xxx/qla_iocb.c:3074:9: sparse: got restricted __le16 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3075:25: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [usertype] status @@ got resunsigned short [usertype] status @@ drivers/scsi/qla2xxx/qla_iocb.c:3075:25: sparse: expected unsigned short [usertype] status drivers/scsi/qla2xxx/qla_iocb.c:3075:25: sparse: got restricted __le16 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3076:32: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [usertype] control_flags @@ got resunsigned short [usertype] control_flags @@ drivers/scsi/qla2xxx/qla_iocb.c:3076:32: sparse: expected unsigned short [usertype] control_flags drivers/scsi/qla2xxx/qla_iocb.c:3076:32: sparse: got restricted __le16 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3078:32: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [usertype] cmd_dsd_count @@ got resunsigned short [usertype] cmd_dsd_count @@ drivers/scsi/qla2xxx/qla_iocb.c:3078:32: sparse: expected unsigned short [usertype] cmd_dsd_count drivers/scsi/qla2xxx/qla_iocb.c:3078:32: sparse: got restricted __le16 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3080:34: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [usertype] total_dsd_count @@ got resunsigned short [usertype] total_dsd_count @@ drivers/scsi/qla2xxx/qla_iocb.c:3080:34: sparse: expected unsigned short [usertype] total_dsd_count drivers/scsi/qla2xxx/qla_iocb.c:3080:34: sparse: got restricted __le16 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3082:32: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned int [usertype] req_bytecount @@ got restrunsigned int [usertype] req_bytecount @@ drivers/scsi/qla2xxx/qla_iocb.c:3082:32: sparse: expected unsigned int [usertype] req_bytecount drivers/scsi/qla2xxx/qla_iocb.c:3082:32: sparse: got restricted __le32 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3084:32: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned int [usertype] rsp_bytecount @@ got restrunsigned int [usertype] rsp_bytecount @@ drivers/scsi/qla2xxx/qla_iocb.c:3084:32: sparse: expected unsigned int [usertype] rsp_bytecount drivers/scsi/qla2xxx/qla_iocb.c:3084:32: sparse: got restricted __le32 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3089:33: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __le32 [usertype] length @@ got icted __le32 [usertype] length @@ drivers/scsi/qla2xxx/qla_iocb.c:3089:33: sparse: expected restricted __le32 [usertype] length drivers/scsi/qla2xxx/qla_iocb.c:3089:33: sparse: got unsigned int [usertype] req_bytecount drivers/scsi/qla2xxx/qla_iocb.c:3093:33: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __le32 [usertype] length @@ got icted __le32 [usertype] length @@ drivers/scsi/qla2xxx/qla_iocb.c:3093:33: sparse: expected restricted __le32 [usertype] length drivers/scsi/qla2xxx/qla_iocb.c:3093:33: sparse: got unsigned int [usertype] rsp_bytecount drivers/scsi/qla2xxx/qla_iocb.c:3143:31: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [usertype] nport_handle @@ got resunsigned short [usertype] nport_handle @@ drivers/scsi/qla2xxx/qla_iocb.c:3143:31: sparse: expected unsigned short [usertype] nport_handle drivers/scsi/qla2xxx/qla_iocb.c:3143:31: sparse: got restricted __le16 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3145:30: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [usertype] comp_status @@ got resunsigned short [usertype] comp_status @@ drivers/scsi/qla2xxx/qla_iocb.c:3145:30: sparse: expected unsigned short [usertype] comp_status drivers/scsi/qla2xxx/qla_iocb.c:3145:30: sparse: got restricted __le16 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3150:32: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [usertype] cmd_dsd_count @@ got resunsigned short [usertype] cmd_dsd_count @@ drivers/scsi/qla2xxx/qla_iocb.c:3150:32: sparse: expected unsigned short [usertype] cmd_dsd_count drivers/scsi/qla2xxx/qla_iocb.c:3150:32: sparse: got restricted __le16 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3152:32: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [usertype] rsp_dsd_count @@ got resunsigned short [usertype] rsp_dsd_count @@ drivers/scsi/qla2xxx/qla_iocb.c:3152:32: sparse: expected unsigned short [usertype] rsp_dsd_count drivers/scsi/qla2xxx/qla_iocb.c:3152:32: sparse: got restricted __le16 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3153:33: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned int [usertype] cmd_byte_count @@ got restrunsigned int [usertype] cmd_byte_count @@ drivers/scsi/qla2xxx/qla_iocb.c:3153:33: sparse: expected unsigned int [usertype] cmd_byte_count drivers/scsi/qla2xxx/qla_iocb.c:3153:33: sparse: got restricted __le32 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3369:37: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [usertype] dseg_count @@ got resunsigned short [usertype] dseg_count @@ drivers/scsi/qla2xxx/qla_iocb.c:3369:37: sparse: expected unsigned short [usertype] dseg_count drivers/scsi/qla2xxx/qla_iocb.c:3369:37: sparse: got restricted __le16 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3372:39: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [usertype] nport_handle @@ got resunsigned short [usertype] nport_handle @@ drivers/scsi/qla2xxx/qla_iocb.c:3372:39: sparse: expected unsigned short [usertype] nport_handle drivers/scsi/qla2xxx/qla_iocb.c:3372:39: sparse: got restricted __le16 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3403:25: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned int [usertype] @@ got restrunsigned int [usertype] @@ drivers/scsi/qla2xxx/qla_iocb.c:3403:25: sparse: expected unsigned int [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3403:25: sparse: got restricted __be32 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3405:44: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [usertype] fcp_cmnd_dseg_len @@ got resunsigned short [usertype] fcp_cmnd_dseg_len @@ drivers/scsi/qla2xxx/qla_iocb.c:3405:44: sparse: expected unsigned short [usertype] fcp_cmnd_dseg_len drivers/scsi/qla2xxx/qla_iocb.c:3405:44: sparse: got restricted __le16 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3410:37: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned int [usertype] byte_count @@ got restrunsigned int [usertype] byte_count @@ drivers/scsi/qla2xxx/qla_iocb.c:3410:37: sparse: expected unsigned int [usertype] byte_count drivers/scsi/qla2xxx/qla_iocb.c:3410:37: sparse: got restricted __le32 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3440:37: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [usertype] dseg_count @@ got resunsigned short [usertype] dseg_count @@ drivers/scsi/qla2xxx/qla_iocb.c:3440:37: sparse: expected unsigned short [usertype] dseg_count drivers/scsi/qla2xxx/qla_iocb.c:3440:37: sparse: got restricted __le16 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3443:39: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [usertype] nport_handle @@ got resunsigned short [usertype] nport_handle @@ drivers/scsi/qla2xxx/qla_iocb.c:3443:39: sparse: expected unsigned short [usertype] nport_handle drivers/scsi/qla2xxx/qla_iocb.c:3443:39: sparse: got restricted __le16 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3461:37: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned int [usertype] byte_count @@ got restrunsigned int [usertype] byte_count @@ drivers/scsi/qla2xxx/qla_iocb.c:3461:37: sparse: expected unsigned int [usertype] byte_count drivers/scsi/qla2xxx/qla_iocb.c:3461:37: sparse: got restricted __le32 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3539:26: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned int [usertype] handle @@ got restrunsigned int [usertype] handle @@ drivers/scsi/qla2xxx/qla_iocb.c:3539:26: sparse: expected unsigned int [usertype] handle drivers/scsi/qla2xxx/qla_iocb.c:3539:26: sparse: got restricted __le32 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3541:40: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [usertype] nport_handle @@ got resunsigned short [usertype] nport_handle @@ drivers/scsi/qla2xxx/qla_iocb.c:3541:40: sparse: expected unsigned short [usertype] nport_handle drivers/scsi/qla2xxx/qla_iocb.c:3541:40: sparse: got restricted __le16 [usertype] >> drivers/scsi/qla2xxx/qla_iocb.c:3547:13: sparse: sparse: incorrect type in argument 1 (different base types) @@ expected unsigned short [usertype] x @@ got resunsigned short [usertype] x @@ drivers/scsi/qla2xxx/qla_iocb.c:3547:13: sparse: expected unsigned short [usertype] x drivers/scsi/qla2xxx/qla_iocb.c:3547:13: sparse: got restricted __le16 [usertype] req_que_no drivers/scsi/qla2xxx/qla_iocb.c:3546:35: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned int [usertype] handle_to_abort @@ got restrunsigned int [usertype] handle_to_abort @@ drivers/scsi/qla2xxx/qla_iocb.c:3546:35: sparse: expected unsigned int [usertype] handle_to_abort drivers/scsi/qla2xxx/qla_iocb.c:3546:35: sparse: got restricted __le32 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3550:32: sparse: sparse: cast from restricted __le16 drivers/scsi/qla2xxx/qla_iocb.c:3550:30: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [usertype] req_que_no @@ got resunsigned short [usertype] req_que_no @@ drivers/scsi/qla2xxx/qla_iocb.c:3550:30: sparse: expected unsigned short [usertype] req_que_no drivers/scsi/qla2xxx/qla_iocb.c:3550:30: sparse: got restricted __le16 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3565:30: sparse: sparse: cast from restricted __le16 drivers/scsi/qla2xxx/qla_iocb.c:3565:28: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short @@ got restricted __leunsigned short @@ drivers/scsi/qla2xxx/qla_iocb.c:3565:28: sparse: expected unsigned short drivers/scsi/qla2xxx/qla_iocb.c:3565:28: sparse: got restricted __le16 [usertype] drivers/scsi/qla2xxx/qla_iocb.c:3587:13: sparse: sparse: cast to restricted __le16 drivers/scsi/qla2xxx/qla_iocb.c:3589:25: sparse: sparse: restricted __le32 degrades to integer drivers/scsi/qla2xxx/qla_iocb.c:3618:26: sparse: sparse: too many warnings vim +3547 drivers/scsi/qla2xxx/qla_iocb.c 3199 3200 /* 3201 * qla82xx_start_scsi() - Send a SCSI command to the ISP 3202 * @sp: command to send to the ISP 3203 * 3204 * Returns non-zero if a failure occurred, else zero. 3205 */ 3206 int 3207 qla82xx_start_scsi(srb_t *sp) 3208 { 3209 int nseg; 3210 unsigned long flags; 3211 struct scsi_cmnd *cmd; 3212 uint32_t *clr_ptr; 3213 uint32_t handle; 3214 uint16_t cnt; 3215 uint16_t req_cnt; 3216 uint16_t tot_dsds; 3217 struct device_reg_82xx __iomem *reg; 3218 uint32_t dbval; 3219 uint32_t *fcp_dl; 3220 uint8_t additional_cdb_len; 3221 struct ct6_dsd *ctx; 3222 struct scsi_qla_host *vha = sp->vha; 3223 struct qla_hw_data *ha = vha->hw; 3224 struct req_que *req = NULL; 3225 struct rsp_que *rsp = NULL; 3226 3227 /* Setup device pointers. */ 3228 reg = &ha->iobase->isp82; 3229 cmd = GET_CMD_SP(sp); 3230 req = vha->req; 3231 rsp = ha->rsp_q_map[0]; 3232 3233 /* So we know we haven't pci_map'ed anything yet */ 3234 tot_dsds = 0; 3235 3236 dbval = 0x04 | (ha->portnum << 5); 3237 3238 /* Send marker if required */ 3239 if (vha->marker_needed != 0) { 3240 if (qla2x00_marker(vha, ha->base_qpair, 3241 0, 0, MK_SYNC_ALL) != QLA_SUCCESS) { 3242 ql_log(ql_log_warn, vha, 0x300c, 3243 "qla2x00_marker failed for cmd=%p.\n", cmd); 3244 return QLA_FUNCTION_FAILED; 3245 } 3246 vha->marker_needed = 0; 3247 } 3248 3249 /* Acquire ring specific lock */ 3250 spin_lock_irqsave(&ha->hardware_lock, flags); 3251 3252 handle = qla2xxx_get_next_handle(req); 3253 if (handle == 0) 3254 goto queuing_error; 3255 3256 /* Map the sg table so we have an accurate count of sg entries needed */ 3257 if (scsi_sg_count(cmd)) { 3258 nseg = dma_map_sg(&ha->pdev->dev, scsi_sglist(cmd), 3259 scsi_sg_count(cmd), cmd->sc_data_direction); 3260 if (unlikely(!nseg)) 3261 goto queuing_error; 3262 } else 3263 nseg = 0; 3264 3265 tot_dsds = nseg; 3266 3267 if (tot_dsds > ql2xshiftctondsd) { 3268 struct cmd_type_6 *cmd_pkt; 3269 uint16_t more_dsd_lists = 0; 3270 struct dsd_dma *dsd_ptr; 3271 uint16_t i; 3272 3273 more_dsd_lists = qla24xx_calc_dsd_lists(tot_dsds); 3274 if ((more_dsd_lists + ha->gbl_dsd_inuse) >= NUM_DSD_CHAIN) { 3275 ql_dbg(ql_dbg_io, vha, 0x300d, 3276 "Num of DSD list %d is than %d for cmd=%p.\n", 3277 more_dsd_lists + ha->gbl_dsd_inuse, NUM_DSD_CHAIN, 3278 cmd); 3279 goto queuing_error; 3280 } 3281 3282 if (more_dsd_lists <= ha->gbl_dsd_avail) 3283 goto sufficient_dsds; 3284 else 3285 more_dsd_lists -= ha->gbl_dsd_avail; 3286 3287 for (i = 0; i < more_dsd_lists; i++) { 3288 dsd_ptr = kzalloc(sizeof(struct dsd_dma), GFP_ATOMIC); 3289 if (!dsd_ptr) { 3290 ql_log(ql_log_fatal, vha, 0x300e, 3291 "Failed to allocate memory for dsd_dma " 3292 "for cmd=%p.\n", cmd); 3293 goto queuing_error; 3294 } 3295 3296 dsd_ptr->dsd_addr = dma_pool_alloc(ha->dl_dma_pool, 3297 GFP_ATOMIC, &dsd_ptr->dsd_list_dma); 3298 if (!dsd_ptr->dsd_addr) { 3299 kfree(dsd_ptr); 3300 ql_log(ql_log_fatal, vha, 0x300f, 3301 "Failed to allocate memory for dsd_addr " 3302 "for cmd=%p.\n", cmd); 3303 goto queuing_error; 3304 } 3305 list_add_tail(&dsd_ptr->list, &ha->gbl_dsd_list); 3306 ha->gbl_dsd_avail++; 3307 } 3308 3309 sufficient_dsds: 3310 req_cnt = 1; 3311 3312 if (req->cnt < (req_cnt + 2)) { 3313 cnt = (uint16_t)RD_REG_DWORD_RELAXED( 3314 ®->req_q_out[0]); 3315 if (req->ring_index < cnt) 3316 req->cnt = cnt - req->ring_index; 3317 else 3318 req->cnt = req->length - 3319 (req->ring_index - cnt); 3320 if (req->cnt < (req_cnt + 2)) 3321 goto queuing_error; 3322 } 3323 3324 ctx = sp->u.scmd.ct6_ctx = 3325 mempool_alloc(ha->ctx_mempool, GFP_ATOMIC); 3326 if (!ctx) { 3327 ql_log(ql_log_fatal, vha, 0x3010, 3328 "Failed to allocate ctx for cmd=%p.\n", cmd); 3329 goto queuing_error; 3330 } 3331 3332 memset(ctx, 0, sizeof(struct ct6_dsd)); 3333 ctx->fcp_cmnd = dma_pool_zalloc(ha->fcp_cmnd_dma_pool, 3334 GFP_ATOMIC, &ctx->fcp_cmnd_dma); 3335 if (!ctx->fcp_cmnd) { 3336 ql_log(ql_log_fatal, vha, 0x3011, 3337 "Failed to allocate fcp_cmnd for cmd=%p.\n", cmd); 3338 goto queuing_error; 3339 } 3340 3341 /* Initialize the DSD list and dma handle */ 3342 INIT_LIST_HEAD(&ctx->dsd_list); 3343 ctx->dsd_use_cnt = 0; 3344 3345 if (cmd->cmd_len > 16) { 3346 additional_cdb_len = cmd->cmd_len - 16; 3347 if ((cmd->cmd_len % 4) != 0) { 3348 /* SCSI command bigger than 16 bytes must be 3349 * multiple of 4 3350 */ 3351 ql_log(ql_log_warn, vha, 0x3012, 3352 "scsi cmd len %d not multiple of 4 " 3353 "for cmd=%p.\n", cmd->cmd_len, cmd); 3354 goto queuing_error_fcp_cmnd; 3355 } 3356 ctx->fcp_cmnd_len = 12 + cmd->cmd_len + 4; 3357 } else { 3358 additional_cdb_len = 0; 3359 ctx->fcp_cmnd_len = 12 + 16 + 4; 3360 } 3361 3362 cmd_pkt = (struct cmd_type_6 *)req->ring_ptr; 3363 cmd_pkt->handle = make_handle(req->id, handle); 3364 3365 /* Zero out remaining portion of packet. */ 3366 /* tagged queuing modifier -- default is TSK_SIMPLE (0). */ 3367 clr_ptr = (uint32_t *)cmd_pkt + 2; 3368 memset(clr_ptr, 0, REQUEST_ENTRY_SIZE - 8); 3369 cmd_pkt->dseg_count = cpu_to_le16(tot_dsds); 3370 3371 /* Set NPORT-ID and LUN number*/ 3372 cmd_pkt->nport_handle = cpu_to_le16(sp->fcport->loop_id); 3373 cmd_pkt->port_id[0] = sp->fcport->d_id.b.al_pa; 3374 cmd_pkt->port_id[1] = sp->fcport->d_id.b.area; 3375 cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain; 3376 cmd_pkt->vp_index = sp->vha->vp_idx; 3377 3378 /* Build IOCB segments */ 3379 if (qla24xx_build_scsi_type_6_iocbs(sp, cmd_pkt, tot_dsds)) 3380 goto queuing_error_fcp_cmnd; 3381 3382 int_to_scsilun(cmd->device->lun, &cmd_pkt->lun); 3383 host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, sizeof(cmd_pkt->lun)); 3384 3385 /* build FCP_CMND IU */ 3386 int_to_scsilun(cmd->device->lun, &ctx->fcp_cmnd->lun); 3387 ctx->fcp_cmnd->additional_cdb_len = additional_cdb_len; 3388 3389 if (cmd->sc_data_direction == DMA_TO_DEVICE) 3390 ctx->fcp_cmnd->additional_cdb_len |= 1; 3391 else if (cmd->sc_data_direction == DMA_FROM_DEVICE) 3392 ctx->fcp_cmnd->additional_cdb_len |= 2; 3393 3394 /* Populate the FCP_PRIO. */ 3395 if (ha->flags.fcp_prio_enabled) 3396 ctx->fcp_cmnd->task_attribute |= 3397 sp->fcport->fcp_prio << 3; 3398 3399 memcpy(ctx->fcp_cmnd->cdb, cmd->cmnd, cmd->cmd_len); 3400 3401 fcp_dl = (uint32_t *)(ctx->fcp_cmnd->cdb + 16 + 3402 additional_cdb_len); 3403 *fcp_dl = htonl((uint32_t)scsi_bufflen(cmd)); 3404 3405 cmd_pkt->fcp_cmnd_dseg_len = cpu_to_le16(ctx->fcp_cmnd_len); 3406 put_unaligned_le64(ctx->fcp_cmnd_dma, 3407 &cmd_pkt->fcp_cmnd_dseg_address); 3408 3409 sp->flags |= SRB_FCP_CMND_DMA_VALID; 3410 cmd_pkt->byte_count = cpu_to_le32((uint32_t)scsi_bufflen(cmd)); 3411 /* Set total data segment count. */ 3412 cmd_pkt->entry_count = (uint8_t)req_cnt; 3413 /* Specify response queue number where 3414 * completion should happen 3415 */ 3416 cmd_pkt->entry_status = (uint8_t) rsp->id; 3417 } else { 3418 struct cmd_type_7 *cmd_pkt; 3419 3420 req_cnt = qla24xx_calc_iocbs(vha, tot_dsds); 3421 if (req->cnt < (req_cnt + 2)) { 3422 cnt = (uint16_t)RD_REG_DWORD_RELAXED( 3423 ®->req_q_out[0]); 3424 if (req->ring_index < cnt) 3425 req->cnt = cnt - req->ring_index; 3426 else 3427 req->cnt = req->length - 3428 (req->ring_index - cnt); 3429 } 3430 if (req->cnt < (req_cnt + 2)) 3431 goto queuing_error; 3432 3433 cmd_pkt = (struct cmd_type_7 *)req->ring_ptr; 3434 cmd_pkt->handle = make_handle(req->id, handle); 3435 3436 /* Zero out remaining portion of packet. */ 3437 /* tagged queuing modifier -- default is TSK_SIMPLE (0).*/ 3438 clr_ptr = (uint32_t *)cmd_pkt + 2; 3439 memset(clr_ptr, 0, REQUEST_ENTRY_SIZE - 8); 3440 cmd_pkt->dseg_count = cpu_to_le16(tot_dsds); 3441 3442 /* Set NPORT-ID and LUN number*/ 3443 cmd_pkt->nport_handle = cpu_to_le16(sp->fcport->loop_id); 3444 cmd_pkt->port_id[0] = sp->fcport->d_id.b.al_pa; 3445 cmd_pkt->port_id[1] = sp->fcport->d_id.b.area; 3446 cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain; 3447 cmd_pkt->vp_index = sp->vha->vp_idx; 3448 3449 int_to_scsilun(cmd->device->lun, &cmd_pkt->lun); 3450 host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, 3451 sizeof(cmd_pkt->lun)); 3452 3453 /* Populate the FCP_PRIO. */ 3454 if (ha->flags.fcp_prio_enabled) 3455 cmd_pkt->task |= sp->fcport->fcp_prio << 3; 3456 3457 /* Load SCSI command packet. */ 3458 memcpy(cmd_pkt->fcp_cdb, cmd->cmnd, cmd->cmd_len); 3459 host_to_fcp_swap(cmd_pkt->fcp_cdb, sizeof(cmd_pkt->fcp_cdb)); 3460 > 3461 cmd_pkt->byte_count = cpu_to_le32((uint32_t)scsi_bufflen(cmd)); 3462 3463 /* Build IOCB segments */ 3464 qla24xx_build_scsi_iocbs(sp, cmd_pkt, tot_dsds, req); 3465 3466 /* Set total data segment count. */ 3467 cmd_pkt->entry_count = (uint8_t)req_cnt; 3468 /* Specify response queue number where 3469 * completion should happen. 3470 */ 3471 cmd_pkt->entry_status = (uint8_t) rsp->id; 3472 3473 } 3474 /* Build command packet. */ 3475 req->current_outstanding_cmd = handle; 3476 req->outstanding_cmds[handle] = sp; 3477 sp->handle = handle; 3478 cmd->host_scribble = (unsigned char *)(unsigned long)handle; 3479 req->cnt -= req_cnt; 3480 wmb(); 3481 3482 /* Adjust ring index. */ 3483 req->ring_index++; 3484 if (req->ring_index == req->length) { 3485 req->ring_index = 0; 3486 req->ring_ptr = req->ring; 3487 } else 3488 req->ring_ptr++; 3489 3490 sp->flags |= SRB_DMA_VALID; 3491 3492 /* Set chip new ring index. */ 3493 /* write, read and verify logic */ 3494 dbval = dbval | (req->id << 8) | (req->ring_index << 16); 3495 if (ql2xdbwr) 3496 qla82xx_wr_32(ha, (uintptr_t __force)ha->nxdb_wr_ptr, dbval); 3497 else { 3498 WRT_REG_DWORD(ha->nxdb_wr_ptr, dbval); 3499 wmb(); 3500 while (RD_REG_DWORD(ha->nxdb_rd_ptr) != dbval) { 3501 WRT_REG_DWORD(ha->nxdb_wr_ptr, dbval); 3502 wmb(); 3503 } 3504 } 3505 3506 /* Manage unprocessed RIO/ZIO commands in response queue. */ 3507 if (vha->flags.process_response_queue && 3508 rsp->ring_ptr->signature != RESPONSE_PROCESSED) 3509 qla24xx_process_response_queue(vha, rsp); 3510 3511 spin_unlock_irqrestore(&ha->hardware_lock, flags); 3512 return QLA_SUCCESS; 3513 3514 queuing_error_fcp_cmnd: 3515 dma_pool_free(ha->fcp_cmnd_dma_pool, ctx->fcp_cmnd, ctx->fcp_cmnd_dma); 3516 queuing_error: 3517 if (tot_dsds) 3518 scsi_dma_unmap(cmd); 3519 3520 if (sp->u.scmd.crc_ctx) { 3521 mempool_free(sp->u.scmd.crc_ctx, ha->ctx_mempool); 3522 sp->u.scmd.crc_ctx = NULL; 3523 } 3524 spin_unlock_irqrestore(&ha->hardware_lock, flags); 3525 3526 return QLA_FUNCTION_FAILED; 3527 } 3528 3529 static void 3530 qla24xx_abort_iocb(srb_t *sp, struct abort_entry_24xx *abt_iocb) 3531 { 3532 struct srb_iocb *aio = &sp->u.iocb_cmd; 3533 scsi_qla_host_t *vha = sp->vha; 3534 struct req_que *req = sp->qpair->req; 3535 3536 memset(abt_iocb, 0, sizeof(struct abort_entry_24xx)); 3537 abt_iocb->entry_type = ABORT_IOCB_TYPE; 3538 abt_iocb->entry_count = 1; 3539 abt_iocb->handle = cpu_to_le32(make_handle(req->id, sp->handle)); 3540 if (sp->fcport) { 3541 abt_iocb->nport_handle = cpu_to_le16(sp->fcport->loop_id); 3542 abt_iocb->port_id[0] = sp->fcport->d_id.b.al_pa; 3543 abt_iocb->port_id[1] = sp->fcport->d_id.b.area; 3544 abt_iocb->port_id[2] = sp->fcport->d_id.b.domain; 3545 } 3546 abt_iocb->handle_to_abort = > 3547 cpu_to_le32(make_handle(aio->u.abt.req_que_no, 3548 aio->u.abt.cmd_hndl)); 3549 abt_iocb->vp_index = vha->vp_idx; 3550 abt_iocb->req_que_no = cpu_to_le16(aio->u.abt.req_que_no); 3551 /* Send the command to the firmware */ 3552 wmb(); 3553 } 3554 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx