@@ -323,36 +323,50 @@ static int update_eth_regs_async(pegasus_t *pegasus)
323323return ret ;
324324}
325325
326- /* Returns 0 on success, error on failure */
327- static int read_mii_word (pegasus_t * pegasus , __u8 phy , __u8 indx , __u16 * regd )
326+ static int __mii_op (pegasus_t * p , __u8 phy , __u8 indx , __u16 * regd , __u8 cmd )
328327{
329328int i ;
330329__u8 data [4 ] = { phy , 0 , 0 , indx };
331330__le16 regdi ;
332- int ret ;
331+ int ret = - ETIMEDOUT ;
333332
334- set_register (pegasus , PhyCtrl , 0 );
335- set_registers (pegasus , PhyAddr , sizeof (data ), data );
336- set_register (pegasus , PhyCtrl , (indx | PHY_READ ));
333+ if (cmd & PHY_WRITE ) {
334+ __le16 * t = (__le16 * ) & data [1 ];
335+ * t = cpu_to_le16 (* regd );
336+ }
337+ set_register (p , PhyCtrl , 0 );
338+ set_registers (p , PhyAddr , sizeof (data ), data );
339+ set_register (p , PhyCtrl , (indx | cmd ));
337340for (i = 0 ; i < REG_TIMEOUT ; i ++ ) {
338- ret = get_registers (pegasus , PhyCtrl , 1 , data );
339- if (ret == - ESHUTDOWN )
341+ ret = get_registers (p , PhyCtrl , 1 , data );
342+ if (ret < 0 )
340343goto fail ;
341344if (data [0 ] & PHY_DONE )
342345break ;
343346}
344-
345347if (i >= REG_TIMEOUT )
346348goto fail ;
347-
348- ret = get_registers (pegasus , PhyData , 2 , & regdi );
349- * regd = le16_to_cpu (regdi );
349+ if (cmd & PHY_READ ) {
350+ ret = get_registers (p , PhyData , 2 , & regdi );
351+ * regd = le16_to_cpu (regdi );
352+ return ret ;
353+ }
354+ return 0 ;
355+ fail :
356+ netif_dbg (p , drv , p -> net , "%s failed\n" , __func__ );
350357return ret ;
358+ }
351359
352- fail :
353- netif_warn (pegasus , drv , pegasus -> net , "%s failed\n" , __func__ );
360+ /* Returns non-negative int on success, error on failure */
361+ static int read_mii_word (pegasus_t * pegasus , __u8 phy , __u8 indx , __u16 * regd )
362+ {
363+ return __mii_op (pegasus , phy , indx , regd , PHY_READ );
364+ }
354365
355- return ret ;
366+ /* Returns zero on success, error on failure */
367+ static int write_mii_word (pegasus_t * pegasus , __u8 phy , __u8 indx , __u16 * regd )
368+ {
369+ return __mii_op (pegasus , phy , indx , regd , PHY_WRITE );
356370}
357371
358372static int mdio_read (struct net_device * dev , int phy_id , int loc )
@@ -364,40 +378,11 @@ static int mdio_read(struct net_device *dev, int phy_id, int loc)
364378return (int )res ;
365379}
366380
367- static int write_mii_word (pegasus_t * pegasus , __u8 phy , __u8 indx , __u16 regd )
368- {
369- int i ;
370- __u8 data [4 ] = { phy , 0 , 0 , indx };
371- int ret ;
372-
373- data [1 ] = (u8 ) regd ;
374- data [2 ] = (u8 ) (regd >> 8 );
375- set_register (pegasus , PhyCtrl , 0 );
376- set_registers (pegasus , PhyAddr , sizeof (data ), data );
377- set_register (pegasus , PhyCtrl , (indx | PHY_WRITE ));
378- for (i = 0 ; i < REG_TIMEOUT ; i ++ ) {
379- ret = get_registers (pegasus , PhyCtrl , 1 , data );
380- if (ret == - ESHUTDOWN )
381- goto fail ;
382- if (data [0 ] & PHY_DONE )
383- break ;
384- }
385-
386- if (i >= REG_TIMEOUT )
387- goto fail ;
388-
389- return ret ;
390-
391- fail :
392- netif_warn (pegasus , drv , pegasus -> net , "%s failed\n" , __func__ );
393- return - ETIMEDOUT ;
394- }
395-
396381static void mdio_write (struct net_device * dev , int phy_id , int loc , int val )
397382{
398383pegasus_t * pegasus = netdev_priv (dev );
399384
400- write_mii_word (pegasus , phy_id , loc , val );
385+ write_mii_word (pegasus , phy_id , loc , ( __u16 * ) & val );
401386}
402387
403388static int read_eprom_word (pegasus_t * pegasus , __u8 index , __u16 * retdata )
@@ -434,7 +419,6 @@ static int read_eprom_word(pegasus_t *pegasus, __u8 index, __u16 *retdata)
434419static inline void enable_eprom_write (pegasus_t * pegasus )
435420{
436421__u8 tmp ;
437- int ret ;
438422
439423get_registers (pegasus , EthCtrl2 , 1 , & tmp );
440424set_register (pegasus , EthCtrl2 , tmp | EPROM_WR_ENABLE );
@@ -443,7 +427,6 @@ static inline void enable_eprom_write(pegasus_t *pegasus)
443427static inline void disable_eprom_write (pegasus_t * pegasus )
444428{
445429__u8 tmp ;
446- int ret ;
447430
448431get_registers (pegasus , EthCtrl2 , 1 , & tmp );
449432set_register (pegasus , EpromCtrl , 0 );
@@ -537,7 +520,8 @@ static inline int reset_mac(pegasus_t *pegasus)
537520if (usb_dev_id [pegasus -> dev_index ].vendor == VENDOR_ELCON ) {
538521__u16 auxmode ;
539522read_mii_word (pegasus , 3 , 0x1b , & auxmode );
540- write_mii_word (pegasus , 3 , 0x1b , auxmode | 4 );
523+ auxmode |= 4 ;
524+ write_mii_word (pegasus , 3 , 0x1b , & auxmode );
541525}
542526
543527return 0 ;
@@ -569,7 +553,8 @@ static int enable_net_traffic(struct net_device *dev, struct usb_device *usb)
569553 usb_dev_id [pegasus -> dev_index ].vendor == VENDOR_DLINK ) {
570554u16 auxmode ;
571555read_mii_word (pegasus , 0 , 0x1b , & auxmode );
572- write_mii_word (pegasus , 0 , 0x1b , auxmode | 4 );
556+ auxmode |= 4 ;
557+ write_mii_word (pegasus , 0 , 0x1b , & auxmode );
573558}
574559
575560return ret ;
@@ -1144,7 +1129,7 @@ static int pegasus_ioctl(struct net_device *net, struct ifreq *rq, int cmd)
11441129case SIOCDEVPRIVATE + 2 :
11451130if (!capable (CAP_NET_ADMIN ))
11461131return - EPERM ;
1147- write_mii_word (pegasus , pegasus -> phy , data [1 ] & 0x1f , data [2 ]);
1132+ write_mii_word (pegasus , pegasus -> phy , data [1 ] & 0x1f , & data [2 ]);
11481133res = 0 ;
11491134break ;
11501135default :
0 commit comments