@@ -2977,16 +2977,11 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
29772977 return ;
29782978
29792979 BUG_ON (fibptr == NULL );
2980- dev = fibptr -> dev ;
2981-
2982- scsi_dma_unmap (scsicmd );
29832980
2984- /* expose physical device if expose_physicald flag is on */
2985- if (scsicmd -> cmnd [0 ] == INQUIRY && !(scsicmd -> cmnd [1 ] & 0x01 )
2986- && expose_physicals > 0 )
2987- aac_expose_phy_device (scsicmd );
2981+ dev = fibptr -> dev ;
29882982
29892983 srbreply = (struct aac_srb_reply * ) fib_data (fibptr );
2984+
29902985 scsicmd -> sense_buffer [0 ] = '\0' ; /* Initialize sense valid flag to false */
29912986
29922987 if (fibptr -> flags & FIB_CONTEXT_FLAG_FASTRESP ) {
@@ -2999,158 +2994,176 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
29992994 */
30002995 scsi_set_resid (scsicmd , scsi_bufflen (scsicmd )
30012996 - le32_to_cpu (srbreply -> data_xfer_length ));
3002- /*
3003- * First check the fib status
3004- */
2997+ }
30052998
3006- if (le32_to_cpu (srbreply -> status ) != ST_OK ) {
3007- int len ;
30082999
3009- printk (KERN_WARNING "aac_srb_callback: srb failed, status = %d\n" , le32_to_cpu (srbreply -> status ));
3010- len = min_t (u32 , le32_to_cpu (srbreply -> sense_data_size ),
3011- SCSI_SENSE_BUFFERSIZE );
3012- scsicmd -> result = DID_ERROR << 16
3013- | COMMAND_COMPLETE << 8
3014- | SAM_STAT_CHECK_CONDITION ;
3015- memcpy (scsicmd -> sense_buffer ,
3016- srbreply -> sense_data , len );
3017- }
3000+ scsi_dma_unmap (scsicmd );
30183001
3019- /*
3020- * Next check the srb status
3021- */
3022- switch ((le32_to_cpu (srbreply -> srb_status ))& 0x3f ) {
3023- case SRB_STATUS_ERROR_RECOVERY :
3024- case SRB_STATUS_PENDING :
3025- case SRB_STATUS_SUCCESS :
3026- scsicmd -> result = DID_OK << 16 | COMMAND_COMPLETE << 8 ;
3027- break ;
3028- case SRB_STATUS_DATA_OVERRUN :
3029- switch (scsicmd -> cmnd [0 ]) {
3030- case READ_6 :
3031- case WRITE_6 :
3032- case READ_10 :
3033- case WRITE_10 :
3034- case READ_12 :
3035- case WRITE_12 :
3036- case READ_16 :
3037- case WRITE_16 :
3038- if (le32_to_cpu (srbreply -> data_xfer_length )
3039- < scsicmd -> underflow )
3040- printk (KERN_WARNING "aacraid: SCSI CMD underflow\n" );
3041- else
3042- printk (KERN_WARNING "aacraid: SCSI CMD Data Overrun\n" );
3043- scsicmd -> result = DID_ERROR << 16
3044- | COMMAND_COMPLETE << 8 ;
3045- break ;
3046- case INQUIRY : {
3047- scsicmd -> result = DID_OK << 16
3048- | COMMAND_COMPLETE << 8 ;
3049- break ;
3050- }
3051- default :
3052- scsicmd -> result = DID_OK << 16 | COMMAND_COMPLETE << 8 ;
3053- break ;
3054- }
3055- break ;
3056- case SRB_STATUS_ABORTED :
3057- scsicmd -> result = DID_ABORT << 16 | ABORT << 8 ;
3058- break ;
3059- case SRB_STATUS_ABORT_FAILED :
3060- /*
3061- * Not sure about this one - but assuming the
3062- * hba was trying to abort for some reason
3063- */
3064- scsicmd -> result = DID_ERROR << 16 | ABORT << 8 ;
3065- break ;
3066- case SRB_STATUS_PARITY_ERROR :
3067- scsicmd -> result = DID_PARITY << 16
3068- | MSG_PARITY_ERROR << 8 ;
3069- break ;
3070- case SRB_STATUS_NO_DEVICE :
3071- case SRB_STATUS_INVALID_PATH_ID :
3072- case SRB_STATUS_INVALID_TARGET_ID :
3073- case SRB_STATUS_INVALID_LUN :
3074- case SRB_STATUS_SELECTION_TIMEOUT :
3075- scsicmd -> result = DID_NO_CONNECT << 16
3076- | COMMAND_COMPLETE << 8 ;
3077- break ;
3002+ /* expose physical device if expose_physicald flag is on */
3003+ if (scsicmd -> cmnd [0 ] == INQUIRY && !(scsicmd -> cmnd [1 ] & 0x01 )
3004+ && expose_physicals > 0 )
3005+ aac_expose_phy_device (scsicmd );
30783006
3079- case SRB_STATUS_COMMAND_TIMEOUT :
3080- case SRB_STATUS_TIMEOUT :
3081- scsicmd -> result = DID_TIME_OUT << 16
3082- | COMMAND_COMPLETE << 8 ;
3083- break ;
3007+ /*
3008+ * First check the fib status
3009+ */
30843010
3085- case SRB_STATUS_BUSY :
3086- scsicmd -> result = DID_BUS_BUSY << 16
3087- | COMMAND_COMPLETE << 8 ;
3088- break ;
3011+ if (le32_to_cpu (srbreply -> status ) != ST_OK ) {
3012+ int len ;
30893013
3090- case SRB_STATUS_BUS_RESET :
3091- scsicmd -> result = DID_RESET << 16
3092- | COMMAND_COMPLETE << 8 ;
3093- break ;
3014+ pr_warn ("aac_srb_callback: srb failed, status = %d\n" ,
3015+ le32_to_cpu (srbreply -> status ));
3016+ len = min_t (u32 , le32_to_cpu (srbreply -> sense_data_size ),
3017+ SCSI_SENSE_BUFFERSIZE );
3018+ scsicmd -> result = DID_ERROR << 16
3019+ | COMMAND_COMPLETE << 8
3020+ | SAM_STAT_CHECK_CONDITION ;
3021+ memcpy (scsicmd -> sense_buffer ,
3022+ srbreply -> sense_data , len );
3023+ }
30943024
3095- case SRB_STATUS_MESSAGE_REJECTED :
3025+ /*
3026+ * Next check the srb status
3027+ */
3028+ switch ((le32_to_cpu (srbreply -> srb_status ))& 0x3f ) {
3029+ case SRB_STATUS_ERROR_RECOVERY :
3030+ case SRB_STATUS_PENDING :
3031+ case SRB_STATUS_SUCCESS :
3032+ scsicmd -> result = DID_OK << 16 | COMMAND_COMPLETE << 8 ;
3033+ break ;
3034+ case SRB_STATUS_DATA_OVERRUN :
3035+ switch (scsicmd -> cmnd [0 ]) {
3036+ case READ_6 :
3037+ case WRITE_6 :
3038+ case READ_10 :
3039+ case WRITE_10 :
3040+ case READ_12 :
3041+ case WRITE_12 :
3042+ case READ_16 :
3043+ case WRITE_16 :
3044+ if (le32_to_cpu (srbreply -> data_xfer_length )
3045+ < scsicmd -> underflow )
3046+ pr_warn ("aacraid: SCSI CMD underflow\n" );
3047+ else
3048+ pr_warn ("aacraid: SCSI CMD Data Overrun\n" );
30963049 scsicmd -> result = DID_ERROR << 16
3097- | MESSAGE_REJECT << 8 ;
3050+ | COMMAND_COMPLETE << 8 ;
3051+ break ;
3052+ case INQUIRY :
3053+ scsicmd -> result = DID_OK << 16
3054+ | COMMAND_COMPLETE << 8 ;
30983055 break ;
3099- case SRB_STATUS_REQUEST_FLUSHED :
3100- case SRB_STATUS_ERROR :
3101- case SRB_STATUS_INVALID_REQUEST :
3102- case SRB_STATUS_REQUEST_SENSE_FAILED :
3103- case SRB_STATUS_NO_HBA :
3104- case SRB_STATUS_UNEXPECTED_BUS_FREE :
3105- case SRB_STATUS_PHASE_SEQUENCE_FAILURE :
3106- case SRB_STATUS_BAD_SRB_BLOCK_LENGTH :
3107- case SRB_STATUS_DELAYED_RETRY :
3108- case SRB_STATUS_BAD_FUNCTION :
3109- case SRB_STATUS_NOT_STARTED :
3110- case SRB_STATUS_NOT_IN_USE :
3111- case SRB_STATUS_FORCE_ABORT :
3112- case SRB_STATUS_DOMAIN_VALIDATION_FAIL :
31133056 default :
3057+ scsicmd -> result = DID_OK << 16 | COMMAND_COMPLETE << 8 ;
3058+ break ;
3059+ }
3060+ break ;
3061+ case SRB_STATUS_ABORTED :
3062+ scsicmd -> result = DID_ABORT << 16 | ABORT << 8 ;
3063+ break ;
3064+ case SRB_STATUS_ABORT_FAILED :
3065+ /*
3066+ * Not sure about this one - but assuming the
3067+ * hba was trying to abort for some reason
3068+ */
3069+ scsicmd -> result = DID_ERROR << 16 | ABORT << 8 ;
3070+ break ;
3071+ case SRB_STATUS_PARITY_ERROR :
3072+ scsicmd -> result = DID_PARITY << 16
3073+ | MSG_PARITY_ERROR << 8 ;
3074+ break ;
3075+ case SRB_STATUS_NO_DEVICE :
3076+ case SRB_STATUS_INVALID_PATH_ID :
3077+ case SRB_STATUS_INVALID_TARGET_ID :
3078+ case SRB_STATUS_INVALID_LUN :
3079+ case SRB_STATUS_SELECTION_TIMEOUT :
3080+ scsicmd -> result = DID_NO_CONNECT << 16
3081+ | COMMAND_COMPLETE << 8 ;
3082+ break ;
3083+
3084+ case SRB_STATUS_COMMAND_TIMEOUT :
3085+ case SRB_STATUS_TIMEOUT :
3086+ scsicmd -> result = DID_TIME_OUT << 16
3087+ | COMMAND_COMPLETE << 8 ;
3088+ break ;
3089+
3090+ case SRB_STATUS_BUSY :
3091+ scsicmd -> result = DID_BUS_BUSY << 16
3092+ | COMMAND_COMPLETE << 8 ;
3093+ break ;
3094+
3095+ case SRB_STATUS_BUS_RESET :
3096+ scsicmd -> result = DID_RESET << 16
3097+ | COMMAND_COMPLETE << 8 ;
3098+ break ;
3099+
3100+ case SRB_STATUS_MESSAGE_REJECTED :
3101+ scsicmd -> result = DID_ERROR << 16
3102+ | MESSAGE_REJECT << 8 ;
3103+ break ;
3104+ case SRB_STATUS_REQUEST_FLUSHED :
3105+ case SRB_STATUS_ERROR :
3106+ case SRB_STATUS_INVALID_REQUEST :
3107+ case SRB_STATUS_REQUEST_SENSE_FAILED :
3108+ case SRB_STATUS_NO_HBA :
3109+ case SRB_STATUS_UNEXPECTED_BUS_FREE :
3110+ case SRB_STATUS_PHASE_SEQUENCE_FAILURE :
3111+ case SRB_STATUS_BAD_SRB_BLOCK_LENGTH :
3112+ case SRB_STATUS_DELAYED_RETRY :
3113+ case SRB_STATUS_BAD_FUNCTION :
3114+ case SRB_STATUS_NOT_STARTED :
3115+ case SRB_STATUS_NOT_IN_USE :
3116+ case SRB_STATUS_FORCE_ABORT :
3117+ case SRB_STATUS_DOMAIN_VALIDATION_FAIL :
3118+ default :
31143119#ifdef AAC_DETAILED_STATUS_INFO
3115- printk ( KERN_INFO "aacraid: SRB ERROR(%u) %s scsi cmd 0x%x - scsi status 0x%x\n" ,
3116- le32_to_cpu (srbreply -> srb_status ) & 0x3F ,
3117- aac_get_status_string (
3118- le32_to_cpu (srbreply -> srb_status ) & 0x3F ),
3119- scsicmd -> cmnd [0 ],
3120- le32_to_cpu (srbreply -> scsi_status ));
3120+ pr_info ( "aacraid: SRB ERROR(%u) %s scsi cmd 0x%x -scsi status 0x%x\n" ,
3121+ le32_to_cpu (srbreply -> srb_status ) & 0x3F ,
3122+ aac_get_status_string (
3123+ le32_to_cpu (srbreply -> srb_status ) & 0x3F ),
3124+ scsicmd -> cmnd [0 ],
3125+ le32_to_cpu (srbreply -> scsi_status ));
31213126#endif
3122- if ((scsicmd -> cmnd [0 ] == ATA_12 )
3123- || (scsicmd -> cmnd [0 ] == ATA_16 )) {
3124- if (scsicmd -> cmnd [2 ] & (0x01 << 5 )) {
3125- scsicmd -> result = DID_OK << 16
3126- | COMMAND_COMPLETE << 8 ;
3127- break ;
3128- } else {
3129- scsicmd -> result = DID_ERROR << 16
3130- | COMMAND_COMPLETE << 8 ;
3131- break ;
3132- }
3127+ /*
3128+ * When the CC bit is SET by the host in ATA pass thru CDB,
3129+ * driver is supposed to return DID_OK
3130+ *
3131+ * When the CC bit is RESET by the host, driver should
3132+ * return DID_ERROR
3133+ */
3134+ if ((scsicmd -> cmnd [0 ] == ATA_12 )
3135+ || (scsicmd -> cmnd [0 ] == ATA_16 )) {
3136+
3137+ if (scsicmd -> cmnd [2 ] & (0x01 << 5 )) {
3138+ scsicmd -> result = DID_OK << 16
3139+ | COMMAND_COMPLETE << 8 ;
3140+ break ;
31333141 } else {
31343142 scsicmd -> result = DID_ERROR << 16
31353143 | COMMAND_COMPLETE << 8 ;
3136- break ;
3144+ break ;
31373145 }
3146+ } else {
3147+ scsicmd -> result = DID_ERROR << 16
3148+ | COMMAND_COMPLETE << 8 ;
3149+ break ;
31383150 }
3139- if (le32_to_cpu (srbreply -> scsi_status )
3140- == SAM_STAT_CHECK_CONDITION ) {
3141- int len ;
3151+ }
3152+ if (le32_to_cpu (srbreply -> scsi_status )
3153+ == SAM_STAT_CHECK_CONDITION ) {
3154+ int len ;
31423155
3143- scsicmd -> result |= SAM_STAT_CHECK_CONDITION ;
3144- len = min_t (u32 , le32_to_cpu (srbreply -> sense_data_size ),
3145- SCSI_SENSE_BUFFERSIZE );
3156+ scsicmd -> result |= SAM_STAT_CHECK_CONDITION ;
3157+ len = min_t (u32 , le32_to_cpu (srbreply -> sense_data_size ),
3158+ SCSI_SENSE_BUFFERSIZE );
31463159#ifdef AAC_DETAILED_STATUS_INFO
3147- printk ( KERN_WARNING "aac_srb_callback: check condition, status = %d len=%d\n" ,
3148- le32_to_cpu (srbreply -> status ), len );
3160+ pr_warn ( "aac_srb_callback: check condition, status = %d len=%d\n" ,
3161+ le32_to_cpu (srbreply -> status ), len );
31493162#endif
3150- memcpy (scsicmd -> sense_buffer ,
3151- srbreply -> sense_data , len );
3152- }
3163+ memcpy (scsicmd -> sense_buffer ,
3164+ srbreply -> sense_data , len );
31533165 }
3166+
31543167 /*
31553168 * OR in the scsi status (already shifted up a bit)
31563169 */
0 commit comments