Commit f675f93a authored by Ondrej Zary's avatar Ondrej Zary Committed by Kalle Valo

airo: Track APList_rid in struct airo_info

Instead of dynamically allocating APList, make it a member of struct
airo_info to always track state of APList_rid.
This simplifies suspend/resume and allows removal of readAPListRid.
Signed-off-by: default avatarOndrej Zary <linux@rainbow-software.org>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent b3bcb1b2
...@@ -1231,7 +1231,7 @@ struct airo_info { ...@@ -1231,7 +1231,7 @@ struct airo_info {
dma_addr_t shared_dma; dma_addr_t shared_dma;
pm_message_t power; pm_message_t power;
SsidRid *SSID; SsidRid *SSID;
APListRid *APList; APListRid APList;
#define PCI_SHARED_LEN 2*MPI_MAX_FIDS*PKTSIZE+RIDSIZE #define PCI_SHARED_LEN 2*MPI_MAX_FIDS*PKTSIZE+RIDSIZE
char proc_name[IFNAMSIZ]; char proc_name[IFNAMSIZ];
...@@ -1848,11 +1848,6 @@ static int readStatusRid(struct airo_info *ai, StatusRid *statr, int lock) ...@@ -1848,11 +1848,6 @@ static int readStatusRid(struct airo_info *ai, StatusRid *statr, int lock)
return PC4500_readrid(ai, RID_STATUS, statr, sizeof(*statr), lock); return PC4500_readrid(ai, RID_STATUS, statr, sizeof(*statr), lock);
} }
static int readAPListRid(struct airo_info *ai, APListRid *aplr)
{
return PC4500_readrid(ai, RID_APLIST, aplr, sizeof(*aplr), 1);
}
static int writeAPListRid(struct airo_info *ai, APListRid *aplr, int lock) static int writeAPListRid(struct airo_info *ai, APListRid *aplr, int lock)
{ {
return PC4500_writerid(ai, RID_APLIST, aplr, sizeof(*aplr), lock); return PC4500_writerid(ai, RID_APLIST, aplr, sizeof(*aplr), lock);
...@@ -2413,7 +2408,6 @@ void stop_airo_card( struct net_device *dev, int freeres ) ...@@ -2413,7 +2408,6 @@ void stop_airo_card( struct net_device *dev, int freeres )
kfree(ai->flash); kfree(ai->flash);
kfree(ai->rssi); kfree(ai->rssi);
kfree(ai->APList);
kfree(ai->SSID); kfree(ai->SSID);
if (freeres) { if (freeres) {
/* PCMCIA frees this stuff, so only for PCI and ISA */ /* PCMCIA frees this stuff, so only for PCI and ISA */
...@@ -2809,6 +2803,7 @@ static struct net_device *_init_airo_card( unsigned short irq, int port, ...@@ -2809,6 +2803,7 @@ static struct net_device *_init_airo_card( unsigned short irq, int port,
init_waitqueue_head (&ai->thr_wait); init_waitqueue_head (&ai->thr_wait);
ai->tfm = NULL; ai->tfm = NULL;
add_airo_dev(ai); add_airo_dev(ai);
ai->APList.len = cpu_to_le16(sizeof(struct APListRid));
if (airo_networks_allocate (ai)) if (airo_networks_allocate (ai))
goto err_out_free; goto err_out_free;
...@@ -3852,8 +3847,6 @@ static u16 setup_card(struct airo_info *ai, u8 *mac, int lock) ...@@ -3852,8 +3847,6 @@ static u16 setup_card(struct airo_info *ai, u8 *mac, int lock)
tdsRssiRid rssi_rid; tdsRssiRid rssi_rid;
CapabilityRid cap_rid; CapabilityRid cap_rid;
kfree(ai->APList);
ai->APList = NULL;
kfree(ai->SSID); kfree(ai->SSID);
ai->SSID = NULL; ai->SSID = NULL;
// general configuration (read/modify/write) // general configuration (read/modify/write)
...@@ -5130,31 +5123,31 @@ static void proc_APList_on_close( struct inode *inode, struct file *file ) { ...@@ -5130,31 +5123,31 @@ static void proc_APList_on_close( struct inode *inode, struct file *file ) {
struct proc_data *data = file->private_data; struct proc_data *data = file->private_data;
struct net_device *dev = PDE_DATA(inode); struct net_device *dev = PDE_DATA(inode);
struct airo_info *ai = dev->ml_priv; struct airo_info *ai = dev->ml_priv;
APListRid APList_rid; APListRid *APList_rid = &ai->APList;
int i; int i;
if ( !data->writelen ) return; if ( !data->writelen ) return;
memset( &APList_rid, 0, sizeof(APList_rid) ); memset(APList_rid, 0, sizeof(*APList_rid));
APList_rid.len = cpu_to_le16(sizeof(APList_rid)); APList_rid->len = cpu_to_le16(sizeof(*APList_rid));
for( i = 0; i < 4 && data->writelen >= (i+1)*6*3; i++ ) { for( i = 0; i < 4 && data->writelen >= (i+1)*6*3; i++ ) {
int j; int j;
for( j = 0; j < 6*3 && data->wbuffer[j+i*6*3]; j++ ) { for( j = 0; j < 6*3 && data->wbuffer[j+i*6*3]; j++ ) {
switch(j%3) { switch(j%3) {
case 0: case 0:
APList_rid.ap[i][j/3]= APList_rid->ap[i][j/3]=
hex_to_bin(data->wbuffer[j+i*6*3])<<4; hex_to_bin(data->wbuffer[j+i*6*3])<<4;
break; break;
case 1: case 1:
APList_rid.ap[i][j/3]|= APList_rid->ap[i][j/3]|=
hex_to_bin(data->wbuffer[j+i*6*3]); hex_to_bin(data->wbuffer[j+i*6*3]);
break; break;
} }
} }
} }
disable_MAC(ai, 1); disable_MAC(ai, 1);
writeAPListRid(ai, &APList_rid, 1); writeAPListRid(ai, APList_rid, 1);
enable_MAC(ai, 1); enable_MAC(ai, 1);
} }
...@@ -5408,7 +5401,7 @@ static int proc_APList_open( struct inode *inode, struct file *file ) { ...@@ -5408,7 +5401,7 @@ static int proc_APList_open( struct inode *inode, struct file *file ) {
struct airo_info *ai = dev->ml_priv; struct airo_info *ai = dev->ml_priv;
int i; int i;
char *ptr; char *ptr;
APListRid APList_rid; APListRid *APList_rid = &ai->APList;
if ((file->private_data = kzalloc(sizeof(struct proc_data ), GFP_KERNEL)) == NULL) if ((file->private_data = kzalloc(sizeof(struct proc_data ), GFP_KERNEL)) == NULL)
return -ENOMEM; return -ENOMEM;
...@@ -5426,13 +5419,12 @@ static int proc_APList_open( struct inode *inode, struct file *file ) { ...@@ -5426,13 +5419,12 @@ static int proc_APList_open( struct inode *inode, struct file *file ) {
} }
data->on_close = proc_APList_on_close; data->on_close = proc_APList_on_close;
readAPListRid(ai, &APList_rid);
ptr = data->rbuffer; ptr = data->rbuffer;
for( i = 0; i < 4; i++ ) { for( i = 0; i < 4; i++ ) {
// We end when we find a zero MAC // We end when we find a zero MAC
if ( !*(int*)APList_rid.ap[i] && if ( !*(int*)APList_rid->ap[i] &&
!*(int*)&APList_rid.ap[i][2]) break; !*(int*)&APList_rid->ap[i][2]) break;
ptr += sprintf(ptr, "%pM\n", APList_rid.ap[i]); ptr += sprintf(ptr, "%pM\n", APList_rid->ap[i]);
} }
if (i==0) ptr += sprintf(ptr, "Not using specific APs\n"); if (i==0) ptr += sprintf(ptr, "Not using specific APs\n");
...@@ -5596,15 +5588,10 @@ static int airo_pci_suspend(struct pci_dev *pdev, pm_message_t state) ...@@ -5596,15 +5588,10 @@ static int airo_pci_suspend(struct pci_dev *pdev, pm_message_t state)
Cmd cmd; Cmd cmd;
Resp rsp; Resp rsp;
if (!ai->APList)
ai->APList = kmalloc(sizeof(APListRid), GFP_KERNEL);
if (!ai->APList)
return -ENOMEM;
if (!ai->SSID) if (!ai->SSID)
ai->SSID = kmalloc(sizeof(SsidRid), GFP_KERNEL); ai->SSID = kmalloc(sizeof(SsidRid), GFP_KERNEL);
if (!ai->SSID) if (!ai->SSID)
return -ENOMEM; return -ENOMEM;
readAPListRid(ai, ai->APList);
readSsidRid(ai, ai->SSID); readSsidRid(ai, ai->SSID);
memset(&cmd, 0, sizeof(cmd)); memset(&cmd, 0, sizeof(cmd));
/* the lock will be released at the end of the resume callback */ /* the lock will be released at the end of the resume callback */
...@@ -5652,11 +5639,7 @@ static int airo_pci_resume(struct pci_dev *pdev) ...@@ -5652,11 +5639,7 @@ static int airo_pci_resume(struct pci_dev *pdev)
kfree(ai->SSID); kfree(ai->SSID);
ai->SSID = NULL; ai->SSID = NULL;
} }
if (ai->APList) { writeAPListRid(ai, &ai->APList, 0);
writeAPListRid(ai, ai->APList, 0);
kfree(ai->APList);
ai->APList = NULL;
}
writeConfigRid(ai, 0); writeConfigRid(ai, 0);
enable_MAC(ai, 0); enable_MAC(ai, 0);
ai->power = PMSG_ON; ai->power = PMSG_ON;
...@@ -5954,7 +5937,7 @@ static int airo_set_wap(struct net_device *dev, ...@@ -5954,7 +5937,7 @@ static int airo_set_wap(struct net_device *dev,
struct airo_info *local = dev->ml_priv; struct airo_info *local = dev->ml_priv;
Cmd cmd; Cmd cmd;
Resp rsp; Resp rsp;
APListRid APList_rid; APListRid *APList_rid = &local->APList;
if (awrq->sa_family != ARPHRD_ETHER) if (awrq->sa_family != ARPHRD_ETHER)
return -EINVAL; return -EINVAL;
...@@ -5967,11 +5950,11 @@ static int airo_set_wap(struct net_device *dev, ...@@ -5967,11 +5950,11 @@ static int airo_set_wap(struct net_device *dev,
issuecommand(local, &cmd, &rsp); issuecommand(local, &cmd, &rsp);
up(&local->sem); up(&local->sem);
} else { } else {
memset(&APList_rid, 0, sizeof(APList_rid)); memset(APList_rid, 0, sizeof(*APList_rid));
APList_rid.len = cpu_to_le16(sizeof(APList_rid)); APList_rid->len = cpu_to_le16(sizeof(*APList_rid));
memcpy(APList_rid.ap[0], awrq->sa_data, ETH_ALEN); memcpy(APList_rid->ap[0], awrq->sa_data, ETH_ALEN);
disable_MAC(local, 1); disable_MAC(local, 1);
writeAPListRid(local, &APList_rid, 1); writeAPListRid(local, APList_rid, 1);
enable_MAC(local, 1); enable_MAC(local, 1);
} }
return 0; return 0;
...@@ -7505,10 +7488,8 @@ static int airo_config_commit(struct net_device *dev, ...@@ -7505,10 +7488,8 @@ static int airo_config_commit(struct net_device *dev,
* parameters. It's now time to commit them in the card */ * parameters. It's now time to commit them in the card */
disable_MAC(local, 1); disable_MAC(local, 1);
if (test_bit (FLAG_RESET, &local->flags)) { if (test_bit (FLAG_RESET, &local->flags)) {
APListRid APList_rid;
SsidRid SSID_rid; SsidRid SSID_rid;
readAPListRid(local, &APList_rid);
readSsidRid(local, &SSID_rid); readSsidRid(local, &SSID_rid);
if (test_bit(FLAG_MPI,&local->flags)) if (test_bit(FLAG_MPI,&local->flags))
setup_card(local, dev->dev_addr, 1 ); setup_card(local, dev->dev_addr, 1 );
...@@ -7516,7 +7497,7 @@ static int airo_config_commit(struct net_device *dev, ...@@ -7516,7 +7497,7 @@ static int airo_config_commit(struct net_device *dev,
reset_airo_card(dev); reset_airo_card(dev);
disable_MAC(local, 1); disable_MAC(local, 1);
writeSsidRid(local, &SSID_rid, 1); writeSsidRid(local, &SSID_rid, 1);
writeAPListRid(local, &APList_rid, 1); writeAPListRid(local, &local->APList, 1);
} }
if (down_interruptible(&local->sem)) if (down_interruptible(&local->sem))
return -ERESTARTSYS; return -ERESTARTSYS;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment