@ -513,10 +513,8 @@ static int smsc95xx_phy_update_flowcontrol(struct usbnet *dev, u8 duplex,
u32 flow , afc_cfg = 0 ;
int ret = smsc95xx_read_reg ( dev , AFC_CFG , & afc_cfg ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error reading AFC_CFG \n " ) ;
if ( ret < 0 )
return ret ;
}
if ( duplex = = DUPLEX_FULL ) {
u8 cap = mii_resolve_flowctrl_fdx ( lcladv , rmtadv ) ;
@ -541,16 +539,10 @@ static int smsc95xx_phy_update_flowcontrol(struct usbnet *dev, u8 duplex,
}
ret = smsc95xx_write_reg ( dev , FLOW , flow ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error writing FLOW \n " ) ;
return ret ;
}
ret = smsc95xx_write_reg ( dev , AFC_CFG , afc_cfg ) ;
if ( ret < 0 )
netdev_warn ( dev - > net , " Error writing AFC_CFG \n " ) ;
return ret ;
return ret ;
return smsc95xx_write_reg ( dev , AFC_CFG , afc_cfg ) ;
}
static int smsc95xx_link_reset ( struct usbnet * dev )
@ -564,16 +556,12 @@ static int smsc95xx_link_reset(struct usbnet *dev)
/* clear interrupt status */
ret = smsc95xx_mdio_read ( dev - > net , mii - > phy_id , PHY_INT_SRC ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error reading PHY_INT_SRC \n " ) ;
if ( ret < 0 )
return ret ;
}
ret = smsc95xx_write_reg ( dev , INT_STS , INT_STS_CLEAR_ALL_ ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error writing INT_STS \n " ) ;
if ( ret < 0 )
return ret ;
}
mii_check_media ( mii , 1 , 1 ) ;
mii_ethtool_gset ( & dev - > mii , & ecmd ) ;
@ -595,10 +583,8 @@ static int smsc95xx_link_reset(struct usbnet *dev)
spin_unlock_irqrestore ( & pdata - > mac_cr_lock , flags ) ;
ret = smsc95xx_write_reg ( dev , MAC_CR , pdata - > mac_cr ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error writing MAC_CR \n " ) ;
if ( ret < 0 )
return ret ;
}
ret = smsc95xx_phy_update_flowcontrol ( dev , ecmd . duplex , lcladv , rmtadv ) ;
if ( ret < 0 )
@ -638,10 +624,8 @@ static int smsc95xx_set_features(struct net_device *netdev,
int ret ;
ret = smsc95xx_read_reg ( dev , COE_CR , & read_buf ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to read COE_CR: %d \n " , ret ) ;
if ( ret < 0 )
return ret ;
}
if ( features & NETIF_F_HW_CSUM )
read_buf | = Tx_COE_EN_ ;
@ -654,10 +638,8 @@ static int smsc95xx_set_features(struct net_device *netdev,
read_buf & = ~ Rx_COE_EN_ ;
ret = smsc95xx_write_reg ( dev , COE_CR , read_buf ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to write COE_CR: %d \n " , ret ) ;
if ( ret < 0 )
return ret ;
}
netif_dbg ( dev , hw , dev - > net , " COE_CR = 0x%08x \n " , read_buf ) ;
return 0 ;
@ -800,16 +782,10 @@ static int smsc95xx_set_mac_address(struct usbnet *dev)
int ret ;
ret = smsc95xx_write_reg ( dev , ADDRL , addr_lo ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to write ADDRL: %d \n " , ret ) ;
return ret ;
}
ret = smsc95xx_write_reg ( dev , ADDRH , addr_hi ) ;
if ( ret < 0 )
netdev_warn ( dev - > net , " Failed to write ADDRH: %d \n " , ret ) ;
return ret ;
return ret ;
return smsc95xx_write_reg ( dev , ADDRH , addr_hi ) ;
}
/* starts the TX path */
@ -825,17 +801,11 @@ static int smsc95xx_start_tx_path(struct usbnet *dev)
spin_unlock_irqrestore ( & pdata - > mac_cr_lock , flags ) ;
ret = smsc95xx_write_reg ( dev , MAC_CR , pdata - > mac_cr ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to write MAC_CR: %d \n " , ret ) ;
if ( ret < 0 )
return ret ;
}
/* Enable Tx at SCSRs */
ret = smsc95xx_write_reg ( dev , TX_CFG , TX_CFG_ON_ ) ;
if ( ret < 0 )
netdev_warn ( dev - > net , " Failed to write TX_CFG: %d \n " , ret ) ;
return ret ;
return smsc95xx_write_reg ( dev , TX_CFG , TX_CFG_ON_ ) ;
}
/* Starts the Receive path */
@ -843,17 +813,12 @@ static int smsc95xx_start_rx_path(struct usbnet *dev, int in_pm)
{
struct smsc95xx_priv * pdata = ( struct smsc95xx_priv * ) ( dev - > data [ 0 ] ) ;
unsigned long flags ;
int ret ;
spin_lock_irqsave ( & pdata - > mac_cr_lock , flags ) ;
pdata - > mac_cr | = MAC_CR_RXEN_ ;
spin_unlock_irqrestore ( & pdata - > mac_cr_lock , flags ) ;
ret = __smsc95xx_write_reg ( dev , MAC_CR , pdata - > mac_cr , in_pm ) ;
if ( ret < 0 )
netdev_warn ( dev - > net , " Failed to write MAC_CR: %d \n " , ret ) ;
return ret ;
return __smsc95xx_write_reg ( dev , MAC_CR , pdata - > mac_cr , in_pm ) ;
}
static int smsc95xx_phy_initialize ( struct usbnet * dev )
@ -910,19 +875,15 @@ static int smsc95xx_reset(struct usbnet *dev)
netif_dbg ( dev , ifup , dev - > net , " entering smsc95xx_reset \n " ) ;
ret = smsc95xx_write_reg ( dev , HW_CFG , HW_CFG_LRST_ ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to write HW_CFG_LRST_ bit in HW_CFG \n " ) ;
if ( ret < 0 )
return ret ;
}
timeout = 0 ;
do {
msleep ( 10 ) ;
ret = smsc95xx_read_reg ( dev , HW_CFG , & read_buf ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to read HW_CFG: %d \n " , ret ) ;
if ( ret < 0 )
return ret ;
}
timeout + + ;
} while ( ( read_buf & HW_CFG_LRST_ ) & & ( timeout < 100 ) ) ;
@ -932,19 +893,15 @@ static int smsc95xx_reset(struct usbnet *dev)
}
ret = smsc95xx_write_reg ( dev , PM_CTRL , PM_CTL_PHY_RST_ ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to write PM_CTRL: %d \n " , ret ) ;
if ( ret < 0 )
return ret ;
}
timeout = 0 ;
do {
msleep ( 10 ) ;
ret = smsc95xx_read_reg ( dev , PM_CTRL , & read_buf ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to read PM_CTRL: %d \n " , ret ) ;
if ( ret < 0 )
return ret ;
}
timeout + + ;
} while ( ( read_buf & PM_CTL_PHY_RST_ ) & & ( timeout < 100 ) ) ;
@ -961,10 +918,8 @@ static int smsc95xx_reset(struct usbnet *dev)
dev - > net - > dev_addr ) ;
ret = smsc95xx_read_reg ( dev , HW_CFG , & read_buf ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to read HW_CFG: %d \n " , ret ) ;
if ( ret < 0 )
return ret ;
}
netif_dbg ( dev , ifup , dev - > net , " Read Value from HW_CFG : 0x%08x \n " ,
read_buf ) ;
@ -972,16 +927,12 @@ static int smsc95xx_reset(struct usbnet *dev)
read_buf | = HW_CFG_BIR_ ;
ret = smsc95xx_write_reg ( dev , HW_CFG , read_buf ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to write HW_CFG_BIR_ bit in HW_CFG \n " ) ;
if ( ret < 0 )
return ret ;
}
ret = smsc95xx_read_reg ( dev , HW_CFG , & read_buf ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to read HW_CFG: %d \n " , ret ) ;
if ( ret < 0 )
return ret ;
}
netif_dbg ( dev , ifup , dev - > net ,
" Read Value from HW_CFG after writing HW_CFG_BIR_: 0x%08x \n " ,
@ -1002,42 +953,32 @@ static int smsc95xx_reset(struct usbnet *dev)
( ulong ) dev - > rx_urb_size ) ;
ret = smsc95xx_write_reg ( dev , BURST_CAP , burst_cap ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to write BURST_CAP: %d \n " , ret ) ;
if ( ret < 0 )
return ret ;
}
ret = smsc95xx_read_reg ( dev , BURST_CAP , & read_buf ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to read BURST_CAP: %d \n " , ret ) ;
if ( ret < 0 )
return ret ;
}
netif_dbg ( dev , ifup , dev - > net ,
" Read Value from BURST_CAP after writing: 0x%08x \n " ,
read_buf ) ;
ret = smsc95xx_write_reg ( dev , BULK_IN_DLY , DEFAULT_BULK_IN_DELAY ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to write BULK_IN_DLY: %d \n " , ret ) ;
if ( ret < 0 )
return ret ;
}
ret = smsc95xx_read_reg ( dev , BULK_IN_DLY , & read_buf ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to read BULK_IN_DLY: %d \n " , ret ) ;
if ( ret < 0 )
return ret ;
}
netif_dbg ( dev , ifup , dev - > net ,
" Read Value from BULK_IN_DLY after writing: 0x%08x \n " ,
read_buf ) ;
ret = smsc95xx_read_reg ( dev , HW_CFG , & read_buf ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to read HW_CFG: %d \n " , ret ) ;
if ( ret < 0 )
return ret ;
}
netif_dbg ( dev , ifup , dev - > net , " Read Value from HW_CFG: 0x%08x \n " ,
read_buf ) ;
@ -1051,69 +992,51 @@ static int smsc95xx_reset(struct usbnet *dev)
read_buf | = NET_IP_ALIGN < < 9 ;
ret = smsc95xx_write_reg ( dev , HW_CFG , read_buf ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to write HW_CFG: %d \n " , ret ) ;
if ( ret < 0 )
return ret ;
}
ret = smsc95xx_read_reg ( dev , HW_CFG , & read_buf ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to read HW_CFG: %d \n " , ret ) ;
if ( ret < 0 )
return ret ;
}
netif_dbg ( dev , ifup , dev - > net ,
" Read Value from HW_CFG after writing: 0x%08x \n " , read_buf ) ;
ret = smsc95xx_write_reg ( dev , INT_STS , INT_STS_CLEAR_ALL_ ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to write INT_STS: %d \n " , ret ) ;
if ( ret < 0 )
return ret ;
}
ret = smsc95xx_read_reg ( dev , ID_REV , & read_buf ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to read ID_REV: %d \n " , ret ) ;
if ( ret < 0 )
return ret ;
}
netif_dbg ( dev , ifup , dev - > net , " ID_REV = 0x%08x \n " , read_buf ) ;
/* Configure GPIO pins as LED outputs */
write_buf = LED_GPIO_CFG_SPD_LED | LED_GPIO_CFG_LNK_LED |
LED_GPIO_CFG_FDX_LED ;
ret = smsc95xx_write_reg ( dev , LED_GPIO_CFG , write_buf ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to write LED_GPIO_CFG: %d \n " , ret ) ;
if ( ret < 0 )
return ret ;
}
/* Init Tx */
ret = smsc95xx_write_reg ( dev , FLOW , 0 ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to write FLOW: %d \n " , ret ) ;
if ( ret < 0 )
return ret ;
}
ret = smsc95xx_write_reg ( dev , AFC_CFG , AFC_CFG_DEFAULT ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to write AFC_CFG: %d \n " , ret ) ;
if ( ret < 0 )
return ret ;
}
/* Don't need mac_cr_lock during initialisation */
ret = smsc95xx_read_reg ( dev , MAC_CR , & pdata - > mac_cr ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to read MAC_CR: %d \n " , ret ) ;
if ( ret < 0 )
return ret ;
}
/* Init Rx */
/* Set Vlan */
ret = smsc95xx_write_reg ( dev , VLAN1 , ( u32 ) ETH_P_8021Q ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to write VLAN1: %d \n " , ret ) ;
if ( ret < 0 )
return ret ;
}
/* Enable or disable checksum offload engines */
ret = smsc95xx_set_features ( dev - > net , dev - > net - > features ) ;
@ -1131,19 +1054,15 @@ static int smsc95xx_reset(struct usbnet *dev)
}
ret = smsc95xx_read_reg ( dev , INT_EP_CTL , & read_buf ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to read INT_EP_CTL: %d \n " , ret ) ;
if ( ret < 0 )
return ret ;
}
/* enable PHY interrupts */
read_buf | = INT_EP_CTL_PHY_INT_ ;
ret = smsc95xx_write_reg ( dev , INT_EP_CTL , read_buf ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to write INT_EP_CTL: %d \n " , ret ) ;
if ( ret < 0 )
return ret ;
}
ret = smsc95xx_start_tx_path ( dev ) ;
if ( ret < 0 ) {
@ -1213,10 +1132,8 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)
/* detect device revision as different features may be available */
ret = smsc95xx_read_reg ( dev , ID_REV , & val ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Failed to read ID_REV: %d \n " , ret ) ;
if ( ret < 0 )
return ret ;
}
val > > = 16 ;
if ( ( val = = ID_REV_CHIP_ID_9500A_ ) | | ( val = = ID_REV_CHIP_ID_9530_ ) | |
@ -1261,17 +1178,13 @@ static int smsc95xx_enable_phy_wakeup_interrupts(struct usbnet *dev, u16 mask)
/* read to clear */
ret = smsc95xx_mdio_read_nopm ( dev - > net , mii - > phy_id , PHY_INT_SRC ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error reading PHY_INT_SRC \n " ) ;
if ( ret < 0 )
return ret ;
}
/* enable interrupt source */
ret = smsc95xx_mdio_read_nopm ( dev - > net , mii - > phy_id , PHY_INT_MASK ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error reading PHY_INT_MASK \n " ) ;
if ( ret < 0 )
return ret ;
}
ret | = mask ;
@ -1287,16 +1200,12 @@ static int smsc95xx_link_ok_nopm(struct usbnet *dev)
/* first, a dummy read, needed to latch some MII phys */
ret = smsc95xx_mdio_read_nopm ( dev - > net , mii - > phy_id , MII_BMSR ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error reading MII_BMSR \n " ) ;
if ( ret < 0 )
return ret ;
}
ret = smsc95xx_mdio_read_nopm ( dev - > net , mii - > phy_id , MII_BMSR ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error reading MII_BMSR \n " ) ;
if ( ret < 0 )
return ret ;
}
return ! ! ( ret & BMSR_LSTATUS ) ;
}
@ -1308,19 +1217,15 @@ static int smsc95xx_enter_suspend0(struct usbnet *dev)
int ret ;
ret = smsc95xx_read_reg_nopm ( dev , PM_CTRL , & val ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error reading PM_CTRL \n " ) ;
if ( ret < 0 )
return ret ;
}
val & = ( ~ ( PM_CTL_SUS_MODE_ | PM_CTL_WUPS_ | PM_CTL_PHY_RST_ ) ) ;
val | = PM_CTL_SUS_MODE_0 ;
ret = smsc95xx_write_reg_nopm ( dev , PM_CTRL , val ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error writing PM_CTRL \n " ) ;
if ( ret < 0 )
return ret ;
}
/* clear wol status */
val & = ~ PM_CTL_WUPS_ ;
@ -1331,15 +1236,11 @@ static int smsc95xx_enter_suspend0(struct usbnet *dev)
val | = PM_CTL_WUPS_ED_ ;
ret = smsc95xx_write_reg_nopm ( dev , PM_CTRL , val ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error writing PM_CTRL \n " ) ;
if ( ret < 0 )
return ret ;
}
/* read back PM_CTRL */
ret = smsc95xx_read_reg_nopm ( dev , PM_CTRL , & val ) ;
if ( ret < 0 )
netdev_warn ( dev - > net , " Error reading PM_CTRL \n " ) ;
return ret ;
}
@ -1360,10 +1261,8 @@ static int smsc95xx_enter_suspend1(struct usbnet *dev)
/* enable energy detect power-down mode */
ret = smsc95xx_mdio_read_nopm ( dev - > net , mii - > phy_id , PHY_MODE_CTRL_STS ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error reading PHY_MODE_CTRL_STS \n " ) ;
if ( ret < 0 )
return ret ;
}
ret | = MODE_CTRL_STS_EDPWRDOWN_ ;
@ -1371,27 +1270,21 @@ static int smsc95xx_enter_suspend1(struct usbnet *dev)
/* enter SUSPEND1 mode */
ret = smsc95xx_read_reg_nopm ( dev , PM_CTRL , & val ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error reading PM_CTRL \n " ) ;
if ( ret < 0 )
return ret ;
}
val & = ~ ( PM_CTL_SUS_MODE_ | PM_CTL_WUPS_ | PM_CTL_PHY_RST_ ) ;
val | = PM_CTL_SUS_MODE_1 ;
ret = smsc95xx_write_reg_nopm ( dev , PM_CTRL , val ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error writing PM_CTRL \n " ) ;
if ( ret < 0 )
return ret ;
}
/* clear wol status, enable energy detection */
val & = ~ PM_CTL_WUPS_ ;
val | = ( PM_CTL_WUPS_ED_ | PM_CTL_ED_EN_ ) ;
ret = smsc95xx_write_reg_nopm ( dev , PM_CTRL , val ) ;
if ( ret < 0 )
netdev_warn ( dev - > net , " Error writing PM_CTRL \n " ) ;
return ret ;
}
@ -1402,17 +1295,13 @@ static int smsc95xx_enter_suspend2(struct usbnet *dev)
int ret ;
ret = smsc95xx_read_reg_nopm ( dev , PM_CTRL , & val ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error reading PM_CTRL \n " ) ;
if ( ret < 0 )
return ret ;
}
val & = ~ ( PM_CTL_SUS_MODE_ | PM_CTL_WUPS_ | PM_CTL_PHY_RST_ ) ;
val | = PM_CTL_SUS_MODE_2 ;
ret = smsc95xx_write_reg_nopm ( dev , PM_CTRL , val ) ;
if ( ret < 0 )
netdev_warn ( dev - > net , " Error writing PM_CTRL \n " ) ;
return ret ;
}
@ -1442,32 +1331,24 @@ static int smsc95xx_suspend(struct usb_interface *intf, pm_message_t message)
/* disable energy detect (link up) & wake up events */
ret = smsc95xx_read_reg_nopm ( dev , WUCSR , & val ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error reading WUCSR \n " ) ;
if ( ret < 0 )
goto done ;
}
val & = ~ ( WUCSR_MPEN_ | WUCSR_WAKE_EN_ ) ;
ret = smsc95xx_write_reg_nopm ( dev , WUCSR , val ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error writing WUCSR \n " ) ;
if ( ret < 0 )
goto done ;
}
ret = smsc95xx_read_reg_nopm ( dev , PM_CTRL , & val ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error reading PM_CTRL \n " ) ;
if ( ret < 0 )
goto done ;
}
val & = ~ ( PM_CTL_ED_EN_ | PM_CTL_WOL_EN_ ) ;
ret = smsc95xx_write_reg_nopm ( dev , PM_CTRL , val ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error writing PM_CTRL \n " ) ;
if ( ret < 0 )
goto done ;
}
ret = smsc95xx_enter_suspend2 ( dev ) ;
goto done ;
@ -1565,7 +1446,6 @@ static int smsc95xx_suspend(struct usb_interface *intf, pm_message_t message)
for ( i = 0 ; i < ( wuff_filter_count * 4 ) ; i + + ) {
ret = smsc95xx_write_reg_nopm ( dev , WUFF , filter_mask [ i ] ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error writing WUFF \n " ) ;
kfree ( filter_mask ) ;
goto done ;
}
@ -1574,67 +1454,51 @@ static int smsc95xx_suspend(struct usb_interface *intf, pm_message_t message)
for ( i = 0 ; i < ( wuff_filter_count / 4 ) ; i + + ) {
ret = smsc95xx_write_reg_nopm ( dev , WUFF , command [ i ] ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error writing WUFF \n " ) ;
if ( ret < 0 )
goto done ;
}
}
for ( i = 0 ; i < ( wuff_filter_count / 4 ) ; i + + ) {
ret = smsc95xx_write_reg_nopm ( dev , WUFF , offset [ i ] ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error writing WUFF \n " ) ;
if ( ret < 0 )
goto done ;
}
}
for ( i = 0 ; i < ( wuff_filter_count / 2 ) ; i + + ) {
ret = smsc95xx_write_reg_nopm ( dev , WUFF , crc [ i ] ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error writing WUFF \n " ) ;
if ( ret < 0 )
goto done ;
}
}
/* clear any pending pattern match packet status */
ret = smsc95xx_read_reg_nopm ( dev , WUCSR , & val ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error reading WUCSR \n " ) ;
if ( ret < 0 )
goto done ;
}
val | = WUCSR_WUFR_ ;
ret = smsc95xx_write_reg_nopm ( dev , WUCSR , val ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error writing WUCSR \n " ) ;
if ( ret < 0 )
goto done ;
}
}
if ( pdata - > wolopts & WAKE_MAGIC ) {
/* clear any pending magic packet status */
ret = smsc95xx_read_reg_nopm ( dev , WUCSR , & val ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error reading WUCSR \n " ) ;
if ( ret < 0 )
goto done ;
}
val | = WUCSR_MPR_ ;
ret = smsc95xx_write_reg_nopm ( dev , WUCSR , val ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error writing WUCSR \n " ) ;
if ( ret < 0 )
goto done ;
}
}
/* enable/disable wakeup sources */
ret = smsc95xx_read_reg_nopm ( dev , WUCSR , & val ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error reading WUCSR \n " ) ;
if ( ret < 0 )
goto done ;
}
if ( pdata - > wolopts & ( WAKE_BCAST | WAKE_MCAST | WAKE_ARP | WAKE_UCAST ) ) {
netdev_info ( dev - > net , " enabling pattern match wakeup \n " ) ;
@ -1653,17 +1517,13 @@ static int smsc95xx_suspend(struct usb_interface *intf, pm_message_t message)
}
ret = smsc95xx_write_reg_nopm ( dev , WUCSR , val ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error writing WUCSR \n " ) ;
if ( ret < 0 )
goto done ;
}
/* enable wol wakeup source */
ret = smsc95xx_read_reg_nopm ( dev , PM_CTRL , & val ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error reading PM_CTRL \n " ) ;
if ( ret < 0 )
goto done ;
}
val | = PM_CTL_WOL_EN_ ;
@ -1672,10 +1532,8 @@ static int smsc95xx_suspend(struct usb_interface *intf, pm_message_t message)
val | = PM_CTL_ED_EN_ ;
ret = smsc95xx_write_reg_nopm ( dev , PM_CTRL , val ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error writing PM_CTRL \n " ) ;
if ( ret < 0 )
goto done ;
}
/* enable receiver to enable frame reception */
smsc95xx_start_rx_path ( dev , 1 ) ;
@ -1702,34 +1560,26 @@ static int smsc95xx_resume(struct usb_interface *intf)
if ( pdata - > wolopts ) {
/* clear wake-up sources */
ret = smsc95xx_read_reg_nopm ( dev , WUCSR , & val ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error reading WUCSR \n " ) ;
if ( ret < 0 )
return ret ;
}
val & = ~ ( WUCSR_WAKE_EN_ | WUCSR_MPEN_ ) ;
ret = smsc95xx_write_reg_nopm ( dev , WUCSR , val ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error writing WUCSR \n " ) ;
if ( ret < 0 )
return ret ;
}
/* clear wake-up status */
ret = smsc95xx_read_reg_nopm ( dev , PM_CTRL , & val ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error reading PM_CTRL \n " ) ;
if ( ret < 0 )
return ret ;
}
val & = ~ PM_CTL_WOL_EN_ ;
val | = PM_CTL_WUPS_ ;
ret = smsc95xx_write_reg_nopm ( dev , PM_CTRL , val ) ;
if ( ret < 0 ) {
netdev_warn ( dev - > net , " Error writing PM_CTRL \n " ) ;
if ( ret < 0 )
return ret ;
}
}
ret = usbnet_resume ( intf ) ;