@@ -794,7 +794,7 @@ static enum utp_ocs ufshcd_get_tr_ocs(struct ufshcd_lrb *lrbp,
794
794
if (cqe )
795
795
return le32_to_cpu (cqe -> status ) & MASK_OCS ;
796
796
797
- return le32_to_cpu ( lrbp -> utr_descriptor_ptr -> header .dword_2 ) & MASK_OCS ;
797
+ return lrbp -> utr_descriptor_ptr -> header .ocs & MASK_OCS ;
798
798
}
799
799
800
800
/**
@@ -2587,10 +2587,10 @@ static void ufshcd_prepare_req_desc_hdr(struct ufshcd_lrb *lrbp, u8 *upiu_flags,
2587
2587
enum dma_data_direction cmd_dir , int ehs_length )
2588
2588
{
2589
2589
struct utp_transfer_req_desc * req_desc = lrbp -> utr_descriptor_ptr ;
2590
- u32 data_direction ;
2591
- u32 dword_0 ;
2592
- u32 dword_1 = 0 ;
2593
- u32 dword_3 = 0 ;
2590
+ struct request_desc_header * h = & req_desc -> header ;
2591
+ enum utp_data_direction data_direction ;
2592
+
2593
+ * h = ( typeof ( * h )){ } ;
2594
2594
2595
2595
if (cmd_dir == DMA_FROM_DEVICE ) {
2596
2596
data_direction = UTP_DEVICE_TO_HOST ;
@@ -2603,25 +2603,22 @@ static void ufshcd_prepare_req_desc_hdr(struct ufshcd_lrb *lrbp, u8 *upiu_flags,
2603
2603
* upiu_flags = UPIU_CMD_FLAGS_NONE ;
2604
2604
}
2605
2605
2606
- dword_0 = data_direction | (lrbp -> command_type << UPIU_COMMAND_TYPE_OFFSET ) |
2607
- ehs_length << 8 ;
2606
+ h -> command_type = lrbp -> command_type ;
2607
+ h -> data_direction = data_direction ;
2608
+ h -> ehs_length = ehs_length ;
2609
+
2608
2610
if (lrbp -> intr_cmd )
2609
- dword_0 |= UTP_REQ_DESC_INT_CMD ;
2611
+ h -> interrupt = 1 ;
2610
2612
2611
2613
/* Prepare crypto related dwords */
2612
- ufshcd_prepare_req_desc_hdr_crypto (lrbp , & dword_0 , & dword_1 , & dword_3 );
2614
+ ufshcd_prepare_req_desc_hdr_crypto (lrbp , h );
2613
2615
2614
- /* Transfer request descriptor header fields */
2615
- req_desc -> header .dword_0 = cpu_to_le32 (dword_0 );
2616
- req_desc -> header .dword_1 = cpu_to_le32 (dword_1 );
2617
2616
/*
2618
2617
* assigning invalid value for command status. Controller
2619
2618
* updates OCS on command completion, with the command
2620
2619
* status
2621
2620
*/
2622
- req_desc -> header .dword_2 =
2623
- cpu_to_le32 (OCS_INVALID_COMMAND_STATUS );
2624
- req_desc -> header .dword_3 = cpu_to_le32 (dword_3 );
2621
+ h -> ocs = OCS_INVALID_COMMAND_STATUS ;
2625
2622
2626
2623
req_desc -> prd_table_length = 0 ;
2627
2624
}
@@ -5445,8 +5442,7 @@ void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag,
5445
5442
if (hba -> dev_cmd .complete ) {
5446
5443
if (cqe ) {
5447
5444
ocs = le32_to_cpu (cqe -> status ) & MASK_OCS ;
5448
- lrbp -> utr_descriptor_ptr -> header .dword_2 =
5449
- cpu_to_le32 (ocs );
5445
+ lrbp -> utr_descriptor_ptr -> header .ocs = ocs ;
5450
5446
}
5451
5447
complete (hba -> dev_cmd .complete );
5452
5448
ufshcd_clk_scaling_update_busy (hba );
@@ -7034,8 +7030,8 @@ static int ufshcd_issue_tm_cmd(struct ufs_hba *hba, int lun_id, int task_id,
7034
7030
int err ;
7035
7031
7036
7032
/* Configure task request descriptor */
7037
- treq .header .dword_0 = cpu_to_le32 ( UTP_REQ_DESC_INT_CMD ) ;
7038
- treq .header .dword_2 = cpu_to_le32 ( OCS_INVALID_COMMAND_STATUS ) ;
7033
+ treq .header .interrupt = 1 ;
7034
+ treq .header .ocs = OCS_INVALID_COMMAND_STATUS ;
7039
7035
7040
7036
/* Configure task request UPIU */
7041
7037
treq .upiu_req .req_header .dword_0 = cpu_to_be32 (lun_id << 8 ) |
@@ -7053,7 +7049,7 @@ static int ufshcd_issue_tm_cmd(struct ufs_hba *hba, int lun_id, int task_id,
7053
7049
if (err == - ETIMEDOUT )
7054
7050
return err ;
7055
7051
7056
- ocs_value = le32_to_cpu ( treq .header .dword_2 ) & MASK_OCS ;
7052
+ ocs_value = treq .header .ocs & MASK_OCS ;
7057
7053
if (ocs_value != OCS_SUCCESS )
7058
7054
dev_err (hba -> dev , "%s: failed, ocs = 0x%x\n" ,
7059
7055
__func__ , ocs_value );
@@ -7213,16 +7209,16 @@ int ufshcd_exec_raw_upiu_cmd(struct ufs_hba *hba,
7213
7209
7214
7210
break ;
7215
7211
case UPIU_TRANSACTION_TASK_REQ :
7216
- treq .header .dword_0 = cpu_to_le32 ( UTP_REQ_DESC_INT_CMD ) ;
7217
- treq .header .dword_2 = cpu_to_le32 ( OCS_INVALID_COMMAND_STATUS ) ;
7212
+ treq .header .interrupt = 1 ;
7213
+ treq .header .ocs = OCS_INVALID_COMMAND_STATUS ;
7218
7214
7219
7215
memcpy (& treq .upiu_req , req_upiu , sizeof (* req_upiu ));
7220
7216
7221
7217
err = __ufshcd_issue_tm_cmd (hba , & treq , tm_f );
7222
7218
if (err == - ETIMEDOUT )
7223
7219
break ;
7224
7220
7225
- ocs_value = le32_to_cpu ( treq .header .dword_2 ) & MASK_OCS ;
7221
+ ocs_value = treq .header .ocs & MASK_OCS ;
7226
7222
if (ocs_value != OCS_SUCCESS ) {
7227
7223
dev_err (hba -> dev , "%s: failed, ocs = 0x%x\n" , __func__ ,
7228
7224
ocs_value );
@@ -10567,6 +10563,39 @@ static const struct dev_pm_ops ufshcd_wl_pm_ops = {
10567
10563
SET_RUNTIME_PM_OPS (ufshcd_wl_runtime_suspend , ufshcd_wl_runtime_resume , NULL )
10568
10564
};
10569
10565
10566
+ static void ufshcd_check_header_layout (void )
10567
+ {
10568
+ BUILD_BUG_ON (((u8 * )& (struct request_desc_header ){
10569
+ .cci = 3 })[0 ] != 3 );
10570
+
10571
+ BUILD_BUG_ON (((u8 * )& (struct request_desc_header ){
10572
+ .ehs_length = 2 })[1 ] != 2 );
10573
+
10574
+ BUILD_BUG_ON (((u8 * )& (struct request_desc_header ){
10575
+ .enable_crypto = 1 })[2 ]
10576
+ != 0x80 );
10577
+
10578
+ BUILD_BUG_ON ((((u8 * )& (struct request_desc_header ){
10579
+ .command_type = 5 ,
10580
+ .data_direction = 3 ,
10581
+ .interrupt = 1 ,
10582
+ })[3 ]) != ((5 << 4 ) | (3 << 1 ) | 1 ));
10583
+
10584
+ BUILD_BUG_ON (((__le32 * )& (struct request_desc_header ){
10585
+ .dunl = cpu_to_le32 (0xdeadbeef )})[1 ] !=
10586
+ cpu_to_le32 (0xdeadbeef ));
10587
+
10588
+ BUILD_BUG_ON (((u8 * )& (struct request_desc_header ){
10589
+ .ocs = 4 })[8 ] != 4 );
10590
+
10591
+ BUILD_BUG_ON (((u8 * )& (struct request_desc_header ){
10592
+ .cds = 5 })[9 ] != 5 );
10593
+
10594
+ BUILD_BUG_ON (((__le32 * )& (struct request_desc_header ){
10595
+ .dunu = cpu_to_le32 (0xbadcafe )})[3 ] !=
10596
+ cpu_to_le32 (0xbadcafe ));
10597
+ }
10598
+
10570
10599
/*
10571
10600
* ufs_dev_wlun_template - describes ufs device wlun
10572
10601
* ufs-device wlun - used to send pm commands
@@ -10592,6 +10621,8 @@ static int __init ufshcd_core_init(void)
10592
10621
{
10593
10622
int ret ;
10594
10623
10624
+ ufshcd_check_header_layout ();
10625
+
10595
10626
ufs_debugfs_init ();
10596
10627
10597
10628
ret = scsi_register_driver (& ufs_dev_wlun_template .gendrv );
0 commit comments