@@ -56,6 +56,18 @@ struct dptxport_apcall_max_drive_settings {
5656 u8 _unk1 [8 ];
5757};
5858
59+ struct dptxport_apcall_drive_settings {
60+ __le32 retcode ;
61+ u8 _unk0 [12 ];
62+ __le32 unk1 ;
63+ __le32 unk2 ;
64+ __le32 unk3 ;
65+ __le32 unk4 ;
66+ __le32 unk5 ;
67+ __le32 unk6 ;
68+ __le32 unk7 ;
69+ };
70+
5971int dptxport_validate_connection (struct apple_epic_service * service , u8 core ,
6072 u8 atc , u8 die )
6173{
@@ -159,6 +171,61 @@ dptxport_call_get_max_drive_settings(struct apple_epic_service *service,
159171 return 0 ;
160172}
161173
174+ static int
175+ dptxport_call_get_drive_settings (struct apple_epic_service * service ,
176+ const void * request_ , size_t request_size ,
177+ void * reply_ , size_t reply_size )
178+ {
179+ struct dptx_port * dptx = service -> cookie ;
180+ const struct dptxport_apcall_drive_settings * request = request_ ;
181+ struct dptxport_apcall_drive_settings * reply = reply_ ;
182+
183+ if (reply_size < sizeof (* reply ) || request_size < sizeof (* request ))
184+ return - EINVAL ;
185+
186+ * reply = * request ;
187+
188+ /* Clear the rest of the buffer */
189+ memset (reply_ + sizeof (* reply ), 0 , reply_size - sizeof (* reply ));
190+
191+ if (reply -> retcode != 4 )
192+ dev_err (service -> ep -> dcp -> dev ,
193+ "get_drive_settings: unexpected retcode %d\n" ,
194+ reply -> retcode );
195+
196+ reply -> retcode = 4 ; /* Should already be 4? */
197+ reply -> unk5 = dptx -> drive_settings [0 ];
198+ reply -> unk6 = 0 ;
199+ reply -> unk7 = dptx -> drive_settings [1 ];
200+
201+ return 0 ;
202+ }
203+
204+ static int
205+ dptxport_call_set_drive_settings (struct apple_epic_service * service ,
206+ const void * request_ , size_t request_size ,
207+ void * reply_ , size_t reply_size )
208+ {
209+ struct dptx_port * dptx = service -> cookie ;
210+ const struct dptxport_apcall_drive_settings * request = request_ ;
211+ struct dptxport_apcall_drive_settings * reply = reply_ ;
212+
213+ if (reply_size < sizeof (* reply ) || request_size < sizeof (* request ))
214+ return - EINVAL ;
215+
216+ * reply = * request ;
217+ reply -> retcode = cpu_to_le32 (0 );
218+
219+ dev_info (service -> ep -> dcp -> dev , "set_drive_settings: %d:%d:%d:%d:%d:%d:%d\n" ,
220+ request -> unk1 , request -> unk2 , request -> unk3 , request -> unk4 ,
221+ request -> unk5 , request -> unk6 , request -> unk7 );
222+
223+ dptx -> drive_settings [0 ] = reply -> unk5 ;
224+ dptx -> drive_settings [1 ] = reply -> unk7 ;
225+
226+ return 0 ;
227+ }
228+
162229static int dptxport_call_get_max_link_rate (struct apple_epic_service * service ,
163230 void * reply_ , size_t reply_size )
164231{
@@ -417,6 +484,12 @@ static int dptxport_call(struct apple_epic_service *service, u32 idx,
417484 case DPTX_APCALL_GET_MAX_DRIVE_SETTINGS :
418485 return dptxport_call_get_max_drive_settings (service , reply ,
419486 reply_size );
487+ case DPTX_APCALL_GET_DRIVE_SETTINGS :
488+ return dptxport_call_get_drive_settings (service , data , data_size ,
489+ reply , reply_size );
490+ case DPTX_APCALL_SET_DRIVE_SETTINGS :
491+ return dptxport_call_set_drive_settings (service , data , data_size ,
492+ reply , reply_size );
420493 case DPTX_APCALL_ACTIVATE :
421494 return dptxport_call_activate (service , data , data_size ,
422495 reply , reply_size );
@@ -427,8 +500,6 @@ static int dptxport_call(struct apple_epic_service *service, u32 idx,
427500 fallthrough ;
428501 /* we can silently ignore and just ACK these calls */
429502 case DPTX_APCALL_DEACTIVATE :
430- case DPTX_APCALL_SET_DRIVE_SETTINGS :
431- case DPTX_APCALL_GET_DRIVE_SETTINGS :
432503 memcpy (reply , data , min (reply_size , data_size ));
433504 if (reply_size >= 4 )
434505 memset (reply , 0 , 4 );
0 commit comments