From: 刘益星 Date: Sat, 29 May 2010 03:39:53 +0000 (+0000) Subject: add mutex_lock between nandc and dm9000,use mutex_lock replace some mutex_trylock... X-Git-Tag: firefly_0821_release~11443 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=a019fb65abadca2b3f2991f19050773dce9f5590;p=firefly-linux-kernel-4.4.55.git add mutex_lock between nandc and dm9000,use mutex_lock replace some mutex_trylock in dm9000 driver --- diff --git a/.config b/.config index 231d8c092761..28bb46d1d9f5 100644 --- a/.config +++ b/.config @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit # Linux kernel version: 2.6.32.9 -# Wed May 19 19:32:08 2010 +# Fri May 28 08:07:09 2010 # CONFIG_ARM=y CONFIG_SYS_SUPPORTS_APM_EMULATION=y @@ -591,7 +591,7 @@ CONFIG_MII=y # CONFIG_SMC91X is not set CONFIG_DM9000=y CONFIG_DM9000_DEBUGLEVEL=4 -# CONFIG_DM9000_USE_NAND_CONTROL is not set +CONFIG_DM9000_USE_NAND_CONTROL=y # CONFIG_DM9000_USE_NOR_CONTROL is not set # CONFIG_DM9000_FORCE_SIMPLE_PHY_POLL is not set # CONFIG_ENC28J60 is not set diff --git a/drivers/mtd/nand/rk2818_nand.c b/drivers/mtd/nand/rk2818_nand.c index 19e65f0a77bd..31a9cb8f2a03 100644 --- a/drivers/mtd/nand/rk2818_nand.c +++ b/drivers/mtd/nand/rk2818_nand.c @@ -1007,6 +1007,14 @@ static void __exit rk2818_nand_exit(void) // nandc dma cs mutex for dm9000 interface +void rk2818_nand_status_mutex_lock(void) +{ + pNANDC pRK28NC= (pNANDC)RK2818_NANDC_BASE; + mutex_lock(&rknand_mutex); + pRK28NC->FMCTL &=0xffffff00; // release chip select + +} + int rk2818_nand_status_mutex_trylock(void) { pNANDC pRK28NC= (pNANDC)RK2818_NANDC_BASE; diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c index 1b0bb74a2e66..701599ac4c42 100644 --- a/drivers/net/dm9000.c +++ b/drivers/net/dm9000.c @@ -148,9 +148,11 @@ typedef struct board_info { } while (0) #ifdef CONFIG_DM9000_USE_NAND_CONTROL +extern void rk2818_nand_status_mutex_lock(void); extern int rk2818_nand_status_mutex_trylock(void); extern void rk2818_nand_status_mutex_unlock(void); #else +static void rk2818_nand_status_mutex_lock(void){return;} static int rk2818_nand_status_mutex_trylock(void) {return 1;} static void rk2818_nand_status_mutex_unlock(void) {return;} #endif @@ -322,8 +324,7 @@ dm9000_read_locked(board_info_t *db, int reg) unsigned long flags; unsigned int ret; - while(!rk2818_nand_status_mutex_trylock()) - dev_dbg(db->dev, "fun:%s, nand busy\n", __func__); + rk2818_nand_status_mutex_lock(); spin_lock_irqsave(&db->lock, flags); ret = ior(db, reg); @@ -383,8 +384,7 @@ dm9000_read_eeprom(board_info_t *db, int offset, u8 *to) mutex_lock(&db->addr_lock); - while(!rk2818_nand_status_mutex_trylock()) - dev_dbg(db->dev, "fun:%s, nand busy\n", __func__); + rk2818_nand_status_mutex_lock(); spin_lock_irqsave(&db->lock, flags); @@ -400,8 +400,7 @@ dm9000_read_eeprom(board_info_t *db, int offset, u8 *to) /* delay for at-least 150uS */ msleep(1); - while(!rk2818_nand_status_mutex_trylock()) - dev_dbg(db->dev, "fun:%s, nand busy\n", __func__); + rk2818_nand_status_mutex_lock(); spin_lock_irqsave(&db->lock, flags); @@ -430,8 +429,7 @@ dm9000_write_eeprom(board_info_t *db, int offset, u8 *data) mutex_lock(&db->addr_lock); - while(!rk2818_nand_status_mutex_trylock()) - dev_dbg(db->dev, "fun:%s, nand busy\n", __func__); + rk2818_nand_status_mutex_lock(); spin_lock_irqsave(&db->lock, flags); iow(db, DM9000_EPAR, offset); @@ -446,8 +444,7 @@ dm9000_write_eeprom(board_info_t *db, int offset, u8 *data) mdelay(1); /* wait at least 150uS to clear */ - while(!rk2818_nand_status_mutex_trylock()) - dev_dbg(db->dev, "fun:%s, nand busy\n", __func__); + rk2818_nand_status_mutex_lock(); spin_lock_irqsave(&db->lock, flags); iow(db, DM9000_EPCR, 0); @@ -519,8 +516,7 @@ static int dm9000_set_rx_csum(struct net_device *dev, uint32_t data) if (dm->can_csum) { dm->rx_csum = data; - while(!rk2818_nand_status_mutex_trylock()) - dev_dbg(dm->dev, "fun:%s, nand busy\n", __func__); + rk2818_nand_status_mutex_lock(); spin_lock_irqsave(&dm->lock, flags); iow(dm, DM9000_RCSR, dm->rx_csum ? RCSR_CSUM : 0); @@ -724,8 +720,7 @@ dm9000_hash_table(struct net_device *dev) dm9000_dbg(db, 1, "entering %s\n", __func__); - while(!rk2818_nand_status_mutex_trylock()) - dev_dbg(db->dev, "fun:%s, nand busy\n", __func__); + rk2818_nand_status_mutex_lock(); spin_lock_irqsave(&db->lock, flags); @@ -825,8 +820,7 @@ static void dm9000_timeout(struct net_device *dev) /* Save previous register address */ reg_save = readb(db->io_addr); - while(!rk2818_nand_status_mutex_trylock()) - dev_dbg(db->dev, "fun:%s, nand busy\n", __func__); + rk2818_nand_status_mutex_lock(); spin_lock_irqsave(&db->lock, flags); @@ -1073,8 +1067,7 @@ static void dm9000_interrupt_work(struct work_struct *work) /* holders of db->lock must always block IRQs */ - while(!rk2818_nand_status_mutex_trylock()) - dev_dbg(db->dev, "fun:%s, nand busy\n", __func__); + rk2818_nand_status_mutex_lock(); spin_lock_irqsave(&db->lock, flags); @@ -1270,8 +1263,7 @@ dm9000_phy_read(struct net_device *dev, int phy_reg_unused, int reg) mutex_lock(&db->addr_lock); - while(!rk2818_nand_status_mutex_trylock()) - dev_dbg(db->dev, "fun:%s, nand busy\n", __func__); + rk2818_nand_status_mutex_lock(); spin_lock_irqsave(&db->lock,flags); @@ -1290,8 +1282,7 @@ dm9000_phy_read(struct net_device *dev, int phy_reg_unused, int reg) dm9000_msleep(db, 1); /* Wait read complete */ - while(!rk2818_nand_status_mutex_trylock()) - dev_dbg(db->dev, "fun:%s, nand busy\n", __func__); + rk2818_nand_status_mutex_lock(); spin_lock_irqsave(&db->lock,flags); @@ -1328,8 +1319,7 @@ dm9000_phy_write(struct net_device *dev, dm9000_dbg(db, 5, "phy_write[%02x] = %04x\n", reg, value); mutex_lock(&db->addr_lock); - while(!rk2818_nand_status_mutex_trylock()) - dev_dbg(db->dev, "fun:%s, nand busy\n", __func__); + rk2818_nand_status_mutex_lock(); spin_lock_irqsave(&db->lock,flags); @@ -1352,8 +1342,7 @@ dm9000_phy_write(struct net_device *dev, dm9000_msleep(db, 1); /* Wait write complete */ - while(!rk2818_nand_status_mutex_trylock()) - dev_dbg(db->dev, "fun:%s, nand busy\n", __func__); + rk2818_nand_status_mutex_lock(); spin_lock_irqsave(&db->lock,flags);