@@ -3545,6 +3545,50 @@ static int opal_get_sum_ranges(struct opal_dev *dev, struct opal_sum_ranges *opa
35453545 return ret ;
35463546}
35473547
3548+ static int opal_stack_reset (struct opal_dev * dev )
3549+ {
3550+ struct opal_stack_reset * req ;
3551+ struct opal_stack_reset_response * resp ;
3552+ int ret ;
3553+
3554+ mutex_lock (& dev -> dev_lock );
3555+
3556+ memset (dev -> cmd , 0 , IO_BUFFER_LENGTH );
3557+ req = (struct opal_stack_reset * )dev -> cmd ;
3558+ req -> extendedComID [0 ] = dev -> comid >> 8 ;
3559+ req -> extendedComID [1 ] = dev -> comid & 0xFF ;
3560+ req -> request_code = cpu_to_be32 (OPAL_STACK_RESET );
3561+
3562+ ret = dev -> send_recv (dev -> data , dev -> comid , TCG_SECP_02 ,
3563+ dev -> cmd , IO_BUFFER_LENGTH , true);
3564+ if (ret ) {
3565+ pr_debug ("Error sending stack reset: %d\n" , ret );
3566+ goto out ;
3567+ }
3568+
3569+ memset (dev -> resp , 0 , IO_BUFFER_LENGTH );
3570+ ret = dev -> send_recv (dev -> data , dev -> comid , TCG_SECP_02 ,
3571+ dev -> resp , IO_BUFFER_LENGTH , false);
3572+ if (ret ) {
3573+ pr_debug ("Error receiving stack reset response: %d\n" , ret );
3574+ goto out ;
3575+ }
3576+
3577+ resp = (struct opal_stack_reset_response * )dev -> resp ;
3578+ if (be16_to_cpu (resp -> data_length ) != 4 ) {
3579+ pr_debug ("Stack reset pending\n" );
3580+ ret = - EBUSY ;
3581+ goto out ;
3582+ }
3583+ if (be32_to_cpu (resp -> response ) != 0 ) {
3584+ pr_debug ("Stack reset failed: %u\n" , be32_to_cpu (resp -> response ));
3585+ ret = - EIO ;
3586+ }
3587+ out :
3588+ mutex_unlock (& dev -> dev_lock );
3589+ return ret ;
3590+ }
3591+
35483592int sed_ioctl (struct opal_dev * dev , unsigned int cmd , void __user * arg )
35493593{
35503594 void * p ;
@@ -3642,6 +3686,9 @@ int sed_ioctl(struct opal_dev *dev, unsigned int cmd, void __user *arg)
36423686 case IOC_OPAL_GET_SUM_STATUS :
36433687 ret = opal_get_sum_ranges (dev , p , arg );
36443688 break ;
3689+ case IOC_OPAL_STACK_RESET :
3690+ ret = opal_stack_reset (dev );
3691+ break ;
36453692
36463693 default :
36473694 break ;
0 commit comments