/*---------------------------------------------------------------- * prism2_fwapply * * Apply the firmware loaded into memory * * Arguments: * rfptr firmware image in kernel memory * wlandev device * * Returns: * 0 - success * ~0 - failure ----------------------------------------------------------------*/ int prism2_fwapply(const struct ihex_binrec *rfptr, wlandevice_t *wlandev) { signed int result = 0; struct p80211msg_dot11req_mibget getmsg; p80211itemd_t *item; u32 *data; /* Initialize the data structures */ ns3data = 0; memset(s3data, 0, sizeof(s3data)); ns3plug = 0; memset(s3plug, 0, sizeof(s3plug)); ns3crc = 0; memset(s3crc, 0, sizeof(s3crc)); ns3info = 0; memset(s3info, 0, sizeof(s3info)); startaddr = 0; nfchunks = 0; memset(fchunk, 0, sizeof(fchunk)); memset(&nicid, 0, sizeof(nicid)); memset(&rfid, 0, sizeof(rfid)); memset(&macid, 0, sizeof(macid)); memset(&priid, 0, sizeof(priid)); /* clear the pda and add an initial END record */ memset(&pda, 0, sizeof(pda)); pda.rec[0] = (hfa384x_pdrec_t *) pda.buf; pda.rec[0]->len = cpu_to_le16(2); /* len in words */ pda.rec[0]->code = cpu_to_le16(HFA384x_PDR_END_OF_PDA); pda.nrec = 1; /*-----------------------------------------------------*/ /* Put card into fwload state */ prism2sta_ifstate(wlandev, P80211ENUM_ifstate_fwload); /* Build the PDA we're going to use. */ if (read_cardpda(&pda, wlandev)) { ; return 1; } /* read the card's PRI-SUP */ memset(&getmsg, 0, sizeof(getmsg)); getmsg.msgcode = DIDmsg_dot11req_mibget; getmsg.msglen = sizeof(getmsg); strcpy(getmsg.devname, wlandev->name); getmsg.mibattribute.did = DIDmsg_dot11req_mibget_mibattribute; getmsg.mibattribute.status = P80211ENUM_msgitem_status_data_ok; getmsg.resultcode.did = DIDmsg_dot11req_mibget_resultcode; getmsg.resultcode.status = P80211ENUM_msgitem_status_no_value; item = (p80211itemd_t *) getmsg.mibattribute.data; item->did = DIDmib_p2_p2NIC_p2PRISupRange; item->status = P80211ENUM_msgitem_status_no_value; data = (u32 *) item->data; /* DIDmsg_dot11req_mibget */ prism2mgmt_mibset_mibget(wlandev, &getmsg); if (getmsg.resultcode.data != P80211ENUM_resultcode_success) ; /* Already in host order */ priid.role = *data++; priid.id = *data++; priid.variant = *data++; priid.bottom = *data++; priid.top = *data++; /* Read the S3 file */ result = read_fwfile(rfptr); if (result) { ; return 1; } result = validate_identity(); if (result) { ; return 1; } if (startaddr == 0x00000000) { ; return 1; } /* Make the image chunks */ result = mkimage(fchunk, &nfchunks); /* Do any plugging */ result = plugimage(fchunk, nfchunks, s3plug, ns3plug, &pda); if (result) { ; return 1; } /* Insert any CRCs */ if (crcimage(fchunk, nfchunks, s3crc, ns3crc)) { ; return 1; } /* Write the image */ result = writeimage(wlandev, fchunk, nfchunks); if (result) { ; return 1; } /* clear any allocated memory */ free_chunks(fchunk, &nfchunks); free_srecs(); ; return result; }
int prism2_fwapply(const struct ihex_binrec *rfptr, wlandevice_t *wlandev) { signed int result = 0; struct p80211msg_dot11req_mibget getmsg; p80211itemd_t *item; u32 *data; ns3data = 0; memset(s3data, 0, sizeof(s3data)); ns3plug = 0; memset(s3plug, 0, sizeof(s3plug)); ns3crc = 0; memset(s3crc, 0, sizeof(s3crc)); ns3info = 0; memset(s3info, 0, sizeof(s3info)); startaddr = 0; nfchunks = 0; memset(fchunk, 0, sizeof(fchunk)); memset(&nicid, 0, sizeof(nicid)); memset(&rfid, 0, sizeof(rfid)); memset(&macid, 0, sizeof(macid)); memset(&priid, 0, sizeof(priid)); memset(&pda, 0, sizeof(pda)); pda.rec[0] = (hfa384x_pdrec_t *) pda.buf; pda.rec[0]->len = cpu_to_le16(2); pda.rec[0]->code = cpu_to_le16(HFA384x_PDR_END_OF_PDA); pda.nrec = 1; prism2sta_ifstate(wlandev, P80211ENUM_ifstate_fwload); if (read_cardpda(&pda, wlandev)) { printk(KERN_ERR "load_cardpda failed, exiting.\n"); return 1; } memset(&getmsg, 0, sizeof(getmsg)); getmsg.msgcode = DIDmsg_dot11req_mibget; getmsg.msglen = sizeof(getmsg); strcpy(getmsg.devname, wlandev->name); getmsg.mibattribute.did = DIDmsg_dot11req_mibget_mibattribute; getmsg.mibattribute.status = P80211ENUM_msgitem_status_data_ok; getmsg.resultcode.did = DIDmsg_dot11req_mibget_resultcode; getmsg.resultcode.status = P80211ENUM_msgitem_status_no_value; item = (p80211itemd_t *) getmsg.mibattribute.data; item->did = DIDmib_p2_p2NIC_p2PRISupRange; item->status = P80211ENUM_msgitem_status_no_value; data = (u32 *) item->data; prism2mgmt_mibset_mibget(wlandev, &getmsg); if (getmsg.resultcode.data != P80211ENUM_resultcode_success) printk(KERN_ERR "Couldn't fetch PRI-SUP info\n"); priid.role = *data++; priid.id = *data++; priid.variant = *data++; priid.bottom = *data++; priid.top = *data++; result = read_fwfile(rfptr); if (result) { printk(KERN_ERR "Failed to read the data exiting.\n"); return 1; } result = validate_identity(); if (result) { printk(KERN_ERR "Incompatible firmware image.\n"); return 1; } if (startaddr == 0x00000000) { printk(KERN_ERR "Can't RAM download a Flash image!\n"); return 1; } result = mkimage(fchunk, &nfchunks); result = plugimage(fchunk, nfchunks, s3plug, ns3plug, &pda); if (result) { printk(KERN_ERR "Failed to plug data.\n"); return 1; } if (crcimage(fchunk, nfchunks, s3crc, ns3crc)) { printk(KERN_ERR "Failed to insert all CRCs\n"); return 1; } result = writeimage(wlandev, fchunk, nfchunks); if (result) { printk(KERN_ERR "Failed to ramwrite image data.\n"); return 1; } free_chunks(fchunk, &nfchunks); free_srecs(); printk(KERN_INFO "prism2_usb: firmware loading finished.\n"); return result; }
/*---------------------------------------------------------------- * prism2_fwapply * * Apply the firmware loaded into memory * * Arguments: * rfptr firmware image in kernel memory * wlandev device * * Returns: * 0 - success * ~0 - failure *---------------------------------------------------------------- */ static int prism2_fwapply(const struct ihex_binrec *rfptr, struct wlandevice *wlandev) { signed int result = 0; struct p80211msg_dot11req_mibget getmsg; struct p80211itemd *item; u32 *data; /* Initialize the data structures */ ns3data = 0; s3data = kcalloc(S3DATA_MAX, sizeof(*s3data), GFP_KERNEL); if (!s3data) { result = -ENOMEM; goto out; } ns3plug = 0; memset(s3plug, 0, sizeof(s3plug)); ns3crc = 0; memset(s3crc, 0, sizeof(s3crc)); ns3info = 0; memset(s3info, 0, sizeof(s3info)); startaddr = 0; nfchunks = 0; memset(fchunk, 0, sizeof(fchunk)); memset(&nicid, 0, sizeof(nicid)); memset(&rfid, 0, sizeof(rfid)); memset(&macid, 0, sizeof(macid)); memset(&priid, 0, sizeof(priid)); /* clear the pda and add an initial END record */ memset(&pda, 0, sizeof(pda)); pda.rec[0] = (struct hfa384x_pdrec *)pda.buf; pda.rec[0]->len = cpu_to_le16(2); /* len in words */ pda.rec[0]->code = cpu_to_le16(HFA384x_PDR_END_OF_PDA); pda.nrec = 1; /*-----------------------------------------------------*/ /* Put card into fwload state */ prism2sta_ifstate(wlandev, P80211ENUM_ifstate_fwload); /* Build the PDA we're going to use. */ if (read_cardpda(&pda, wlandev)) { netdev_err(wlandev->netdev, "load_cardpda failed, exiting.\n"); result = 1; goto out; } /* read the card's PRI-SUP */ memset(&getmsg, 0, sizeof(getmsg)); getmsg.msgcode = DIDmsg_dot11req_mibget; getmsg.msglen = sizeof(getmsg); strcpy(getmsg.devname, wlandev->name); getmsg.mibattribute.did = DIDmsg_dot11req_mibget_mibattribute; getmsg.mibattribute.status = P80211ENUM_msgitem_status_data_ok; getmsg.resultcode.did = DIDmsg_dot11req_mibget_resultcode; getmsg.resultcode.status = P80211ENUM_msgitem_status_no_value; item = (struct p80211itemd *)getmsg.mibattribute.data; item->did = DIDmib_p2_p2NIC_p2PRISupRange; item->status = P80211ENUM_msgitem_status_no_value; data = (u32 *)item->data; /* DIDmsg_dot11req_mibget */ prism2mgmt_mibset_mibget(wlandev, &getmsg); if (getmsg.resultcode.data != P80211ENUM_resultcode_success) netdev_err(wlandev->netdev, "Couldn't fetch PRI-SUP info\n"); /* Already in host order */ priid.role = *data++; priid.id = *data++; priid.variant = *data++; priid.bottom = *data++; priid.top = *data++; /* Read the S3 file */ result = read_fwfile(rfptr); if (result) { netdev_err(wlandev->netdev, "Failed to read the data exiting.\n"); goto out; } result = validate_identity(); if (result) { netdev_err(wlandev->netdev, "Incompatible firmware image.\n"); goto out; } if (startaddr == 0x00000000) { netdev_err(wlandev->netdev, "Can't RAM download a Flash image!\n"); result = 1; goto out; } /* Make the image chunks */ result = mkimage(fchunk, &nfchunks); if (result) { netdev_err(wlandev->netdev, "Failed to make image chunk.\n"); goto free_chunks; } /* Do any plugging */ result = plugimage(fchunk, nfchunks, s3plug, ns3plug, &pda); if (result) { netdev_err(wlandev->netdev, "Failed to plug data.\n"); goto free_chunks; } /* Insert any CRCs */ result = crcimage(fchunk, nfchunks, s3crc, ns3crc); if (result) { netdev_err(wlandev->netdev, "Failed to insert all CRCs\n"); goto free_chunks; } /* Write the image */ result = writeimage(wlandev, fchunk, nfchunks); if (result) { netdev_err(wlandev->netdev, "Failed to ramwrite image data.\n"); goto free_chunks; } netdev_info(wlandev->netdev, "prism2_usb: firmware loading finished.\n"); free_chunks: /* clear any allocated memory */ free_chunks(fchunk, &nfchunks); free_srecs(); out: return result; }