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: Ondrej Zary <linux@rainbow-software.org> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
@@ -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)
|
|||||||
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 )
|
|||||||
|
|
||||||
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,
|
|||||||
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)
|
|||||||
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 ) {
|
|||||||
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 ) {
|
|||||||
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 ) {
|
|||||||
}
|
}
|
||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
* 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,
|
|||||||
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;
|
||||||
|
Reference in New Issue
Block a user