@@ -171,6 +171,7 @@ struct ax88179_data {
171
171
u8 eee_active ;
172
172
u16 rxctl ;
173
173
u16 reserved ;
174
+ u8 in_pm ;
174
175
};
175
176
176
177
struct ax88179_int_data {
@@ -187,15 +188,29 @@ static const struct {
187
188
{7 , 0xcc , 0x4c , 0x18 , 8 },
188
189
};
189
190
191
+ static void ax88179_set_pm_mode (struct usbnet * dev , bool pm_mode )
192
+ {
193
+ struct ax88179_data * ax179_data = (struct ax88179_data * )dev -> data ;
194
+
195
+ ax179_data -> in_pm = pm_mode ;
196
+ }
197
+
198
+ static int ax88179_in_pm (struct usbnet * dev )
199
+ {
200
+ struct ax88179_data * ax179_data = (struct ax88179_data * )dev -> data ;
201
+
202
+ return ax179_data -> in_pm ;
203
+ }
204
+
190
205
static int __ax88179_read_cmd (struct usbnet * dev , u8 cmd , u16 value , u16 index ,
191
- u16 size , void * data , int in_pm )
206
+ u16 size , void * data )
192
207
{
193
208
int ret ;
194
209
int (* fn )(struct usbnet * , u8 , u8 , u16 , u16 , void * , u16 );
195
210
196
211
BUG_ON (!dev );
197
212
198
- if (!in_pm )
213
+ if (!ax88179_in_pm ( dev ) )
199
214
fn = usbnet_read_cmd ;
200
215
else
201
216
fn = usbnet_read_cmd_nopm ;
@@ -211,14 +226,14 @@ static int __ax88179_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index,
211
226
}
212
227
213
228
static int __ax88179_write_cmd (struct usbnet * dev , u8 cmd , u16 value , u16 index ,
214
- u16 size , const void * data , int in_pm )
229
+ u16 size , const void * data )
215
230
{
216
231
int ret ;
217
232
int (* fn )(struct usbnet * , u8 , u8 , u16 , u16 , const void * , u16 );
218
233
219
234
BUG_ON (!dev );
220
235
221
- if (!in_pm )
236
+ if (!ax88179_in_pm ( dev ) )
222
237
fn = usbnet_write_cmd ;
223
238
else
224
239
fn = usbnet_write_cmd_nopm ;
@@ -251,64 +266,23 @@ static void ax88179_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value,
251
266
}
252
267
}
253
268
254
- static int ax88179_read_cmd_nopm (struct usbnet * dev , u8 cmd , u16 value ,
255
- u16 index , u16 size , void * data )
256
- {
257
- int ret ;
258
-
259
- if (2 == size ) {
260
- u16 buf ;
261
- ret = __ax88179_read_cmd (dev , cmd , value , index , size , & buf , 1 );
262
- le16_to_cpus (& buf );
263
- * ((u16 * )data ) = buf ;
264
- } else if (4 == size ) {
265
- u32 buf ;
266
- ret = __ax88179_read_cmd (dev , cmd , value , index , size , & buf , 1 );
267
- le32_to_cpus (& buf );
268
- * ((u32 * )data ) = buf ;
269
- } else {
270
- ret = __ax88179_read_cmd (dev , cmd , value , index , size , data , 1 );
271
- }
272
-
273
- return ret ;
274
- }
275
-
276
- static int ax88179_write_cmd_nopm (struct usbnet * dev , u8 cmd , u16 value ,
277
- u16 index , u16 size , const void * data )
278
- {
279
- int ret ;
280
-
281
- if (2 == size ) {
282
- u16 buf ;
283
- buf = * ((u16 * )data );
284
- cpu_to_le16s (& buf );
285
- ret = __ax88179_write_cmd (dev , cmd , value , index ,
286
- size , & buf , 1 );
287
- } else {
288
- ret = __ax88179_write_cmd (dev , cmd , value , index ,
289
- size , data , 1 );
290
- }
291
-
292
- return ret ;
293
- }
294
-
295
269
static int ax88179_read_cmd (struct usbnet * dev , u8 cmd , u16 value , u16 index ,
296
270
u16 size , void * data )
297
271
{
298
272
int ret ;
299
273
300
274
if (2 == size ) {
301
275
u16 buf = 0 ;
302
- ret = __ax88179_read_cmd (dev , cmd , value , index , size , & buf , 0 );
276
+ ret = __ax88179_read_cmd (dev , cmd , value , index , size , & buf );
303
277
le16_to_cpus (& buf );
304
278
* ((u16 * )data ) = buf ;
305
279
} else if (4 == size ) {
306
280
u32 buf = 0 ;
307
- ret = __ax88179_read_cmd (dev , cmd , value , index , size , & buf , 0 );
281
+ ret = __ax88179_read_cmd (dev , cmd , value , index , size , & buf );
308
282
le32_to_cpus (& buf );
309
283
* ((u32 * )data ) = buf ;
310
284
} else {
311
- ret = __ax88179_read_cmd (dev , cmd , value , index , size , data , 0 );
285
+ ret = __ax88179_read_cmd (dev , cmd , value , index , size , data );
312
286
}
313
287
314
288
return ret ;
@@ -324,10 +298,10 @@ static int ax88179_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index,
324
298
buf = * ((u16 * )data );
325
299
cpu_to_le16s (& buf );
326
300
ret = __ax88179_write_cmd (dev , cmd , value , index ,
327
- size , & buf , 0 );
301
+ size , & buf );
328
302
} else {
329
303
ret = __ax88179_write_cmd (dev , cmd , value , index ,
330
- size , data , 0 );
304
+ size , data );
331
305
}
332
306
333
307
return ret ;
@@ -430,66 +404,60 @@ static int ax88179_suspend(struct usb_interface *intf, pm_message_t message)
430
404
u16 tmp16 ;
431
405
u8 tmp8 ;
432
406
407
+ ax88179_set_pm_mode (dev , true);
408
+
433
409
usbnet_suspend (intf , message );
434
410
435
411
/* Disable RX path */
436
- ax88179_read_cmd_nopm (dev , AX_ACCESS_MAC , AX_MEDIUM_STATUS_MODE ,
437
- 2 , 2 , & tmp16 );
412
+ ax88179_read_cmd (dev , AX_ACCESS_MAC , AX_MEDIUM_STATUS_MODE ,
413
+ 2 , 2 , & tmp16 );
438
414
tmp16 &= ~AX_MEDIUM_RECEIVE_EN ;
439
- ax88179_write_cmd_nopm (dev , AX_ACCESS_MAC , AX_MEDIUM_STATUS_MODE ,
440
- 2 , 2 , & tmp16 );
415
+ ax88179_write_cmd (dev , AX_ACCESS_MAC , AX_MEDIUM_STATUS_MODE ,
416
+ 2 , 2 , & tmp16 );
441
417
442
418
/* Force bulk-in zero length */
443
- ax88179_read_cmd_nopm (dev , AX_ACCESS_MAC , AX_PHYPWR_RSTCTL ,
444
- 2 , 2 , & tmp16 );
419
+ ax88179_read_cmd (dev , AX_ACCESS_MAC , AX_PHYPWR_RSTCTL ,
420
+ 2 , 2 , & tmp16 );
445
421
446
422
tmp16 |= AX_PHYPWR_RSTCTL_BZ | AX_PHYPWR_RSTCTL_IPRL ;
447
- ax88179_write_cmd_nopm (dev , AX_ACCESS_MAC , AX_PHYPWR_RSTCTL ,
448
- 2 , 2 , & tmp16 );
423
+ ax88179_write_cmd (dev , AX_ACCESS_MAC , AX_PHYPWR_RSTCTL ,
424
+ 2 , 2 , & tmp16 );
449
425
450
426
/* change clock */
451
427
tmp8 = 0 ;
452
- ax88179_write_cmd_nopm (dev , AX_ACCESS_MAC , AX_CLK_SELECT , 1 , 1 , & tmp8 );
428
+ ax88179_write_cmd (dev , AX_ACCESS_MAC , AX_CLK_SELECT , 1 , 1 , & tmp8 );
453
429
454
430
/* Configure RX control register => stop operation */
455
431
tmp16 = AX_RX_CTL_STOP ;
456
- ax88179_write_cmd_nopm (dev , AX_ACCESS_MAC , AX_RX_CTL , 2 , 2 , & tmp16 );
432
+ ax88179_write_cmd (dev , AX_ACCESS_MAC , AX_RX_CTL , 2 , 2 , & tmp16 );
433
+
434
+ ax88179_set_pm_mode (dev , false);
457
435
458
436
return 0 ;
459
437
}
460
438
461
439
/* This function is used to enable the autodetach function. */
462
440
/* This function is determined by offset 0x43 of EEPROM */
463
- static int ax88179_auto_detach (struct usbnet * dev , int in_pm )
441
+ static int ax88179_auto_detach (struct usbnet * dev )
464
442
{
465
443
u16 tmp16 ;
466
444
u8 tmp8 ;
467
- int (* fnr )(struct usbnet * , u8 , u16 , u16 , u16 , void * );
468
- int (* fnw )(struct usbnet * , u8 , u16 , u16 , u16 , const void * );
469
-
470
- if (!in_pm ) {
471
- fnr = ax88179_read_cmd ;
472
- fnw = ax88179_write_cmd ;
473
- } else {
474
- fnr = ax88179_read_cmd_nopm ;
475
- fnw = ax88179_write_cmd_nopm ;
476
- }
477
445
478
- if (fnr (dev , AX_ACCESS_EEPROM , 0x43 , 1 , 2 , & tmp16 ) < 0 )
446
+ if (ax88179_read_cmd (dev , AX_ACCESS_EEPROM , 0x43 , 1 , 2 , & tmp16 ) < 0 )
479
447
return 0 ;
480
448
481
449
if ((tmp16 == 0xFFFF ) || (!(tmp16 & 0x0100 )))
482
450
return 0 ;
483
451
484
452
/* Enable Auto Detach bit */
485
453
tmp8 = 0 ;
486
- fnr (dev , AX_ACCESS_MAC , AX_CLK_SELECT , 1 , 1 , & tmp8 );
454
+ ax88179_read_cmd (dev , AX_ACCESS_MAC , AX_CLK_SELECT , 1 , 1 , & tmp8 );
487
455
tmp8 |= AX_CLK_SELECT_ULR ;
488
- fnw (dev , AX_ACCESS_MAC , AX_CLK_SELECT , 1 , 1 , & tmp8 );
456
+ ax88179_write_cmd (dev , AX_ACCESS_MAC , AX_CLK_SELECT , 1 , 1 , & tmp8 );
489
457
490
- fnr (dev , AX_ACCESS_MAC , AX_PHYPWR_RSTCTL , 2 , 2 , & tmp16 );
458
+ ax88179_read_cmd (dev , AX_ACCESS_MAC , AX_PHYPWR_RSTCTL , 2 , 2 , & tmp16 );
491
459
tmp16 |= AX_PHYPWR_RSTCTL_AT ;
492
- fnw (dev , AX_ACCESS_MAC , AX_PHYPWR_RSTCTL , 2 , 2 , & tmp16 );
460
+ ax88179_write_cmd (dev , AX_ACCESS_MAC , AX_PHYPWR_RSTCTL , 2 , 2 , & tmp16 );
493
461
494
462
return 0 ;
495
463
}
@@ -500,32 +468,36 @@ static int ax88179_resume(struct usb_interface *intf)
500
468
u16 tmp16 ;
501
469
u8 tmp8 ;
502
470
471
+ ax88179_set_pm_mode (dev , true);
472
+
503
473
usbnet_link_change (dev , 0 , 0 );
504
474
505
475
/* Power up ethernet PHY */
506
476
tmp16 = 0 ;
507
- ax88179_write_cmd_nopm (dev , AX_ACCESS_MAC , AX_PHYPWR_RSTCTL ,
508
- 2 , 2 , & tmp16 );
477
+ ax88179_write_cmd (dev , AX_ACCESS_MAC , AX_PHYPWR_RSTCTL ,
478
+ 2 , 2 , & tmp16 );
509
479
udelay (1000 );
510
480
511
481
tmp16 = AX_PHYPWR_RSTCTL_IPRL ;
512
- ax88179_write_cmd_nopm (dev , AX_ACCESS_MAC , AX_PHYPWR_RSTCTL ,
513
- 2 , 2 , & tmp16 );
482
+ ax88179_write_cmd (dev , AX_ACCESS_MAC , AX_PHYPWR_RSTCTL ,
483
+ 2 , 2 , & tmp16 );
514
484
msleep (200 );
515
485
516
486
/* Ethernet PHY Auto Detach*/
517
- ax88179_auto_detach (dev , 1 );
487
+ ax88179_auto_detach (dev );
518
488
519
489
/* Enable clock */
520
- ax88179_read_cmd_nopm (dev , AX_ACCESS_MAC , AX_CLK_SELECT , 1 , 1 , & tmp8 );
490
+ ax88179_read_cmd (dev , AX_ACCESS_MAC , AX_CLK_SELECT , 1 , 1 , & tmp8 );
521
491
tmp8 |= AX_CLK_SELECT_ACS | AX_CLK_SELECT_BCS ;
522
- ax88179_write_cmd_nopm (dev , AX_ACCESS_MAC , AX_CLK_SELECT , 1 , 1 , & tmp8 );
492
+ ax88179_write_cmd (dev , AX_ACCESS_MAC , AX_CLK_SELECT , 1 , 1 , & tmp8 );
523
493
msleep (100 );
524
494
525
495
/* Configure RX control register => start operation */
526
496
tmp16 = AX_RX_CTL_DROPCRCERR | AX_RX_CTL_IPE | AX_RX_CTL_START |
527
497
AX_RX_CTL_AP | AX_RX_CTL_AMALL | AX_RX_CTL_AB ;
528
- ax88179_write_cmd_nopm (dev , AX_ACCESS_MAC , AX_RX_CTL , 2 , 2 , & tmp16 );
498
+ ax88179_write_cmd (dev , AX_ACCESS_MAC , AX_RX_CTL , 2 , 2 , & tmp16 );
499
+
500
+ ax88179_set_pm_mode (dev , false);
529
501
530
502
return usbnet_resume (intf );
531
503
}
@@ -601,8 +573,7 @@ ax88179_get_eeprom(struct net_device *net, struct ethtool_eeprom *eeprom,
601
573
/* ax88179/178A returns 2 bytes from eeprom on read */
602
574
for (i = first_word ; i <= last_word ; i ++ ) {
603
575
ret = __ax88179_read_cmd (dev , AX_ACCESS_EEPROM , i , 1 , 2 ,
604
- & eeprom_buff [i - first_word ],
605
- 0 );
576
+ & eeprom_buff [i - first_word ]);
606
577
if (ret < 0 ) {
607
578
kfree (eeprom_buff );
608
579
return - EIO ;
@@ -1071,7 +1042,7 @@ static int ax88179_check_eeprom(struct usbnet *dev)
1071
1042
} while (buf & EEP_BUSY );
1072
1043
1073
1044
__ax88179_read_cmd (dev , AX_ACCESS_MAC , AX_SROM_DATA_LOW ,
1074
- 2 , 2 , & eeprom [i * 2 ], 0 );
1045
+ 2 , 2 , & eeprom [i * 2 ]);
1075
1046
1076
1047
if ((i == 0 ) && (eeprom [0 ] == 0xFF ))
1077
1048
return - EINVAL ;
@@ -1640,7 +1611,7 @@ static int ax88179_reset(struct usbnet *dev)
1640
1611
msleep (100 );
1641
1612
1642
1613
/* Ethernet PHY Auto Detach*/
1643
- ax88179_auto_detach (dev , 0 );
1614
+ ax88179_auto_detach (dev );
1644
1615
1645
1616
/* Read MAC address from DTB or asix chip */
1646
1617
ax88179_get_mac_addr (dev );
0 commit comments