~ubuntu-branches/ubuntu/quantal/linux-lowlatency/quantal

« back to all changes in this revision

Viewing changes to drivers/staging/rtl8712/hal_init.c

  • Committer: Package Import Robot
  • Author(s): Alessio Igor Bogani
  • Date: 2011-10-26 11:13:05 UTC
  • Revision ID: package-import@ubuntu.com-20111026111305-04kado7d1u2er2rl
Tags: 3.2.0-16.25
Add new lowlatency kernel flavour

Show diffs side-by-side

added added

removed removed

Lines of Context:
42
42
#define FWBUFF_ALIGN_SZ 512
43
43
#define MAX_DUMP_FWSZ   49152 /*default = 49152 (48k)*/
44
44
 
45
 
static u32 rtl871x_open_fw(struct _adapter *padapter, void **pphfwfile_hdl,
46
 
                    const u8 **ppmappedfw)
47
 
{
 
45
static void rtl871x_load_fw_cb(const struct firmware *firmware, void *context)
 
46
{
 
47
        struct _adapter *padapter = context;
 
48
 
 
49
        complete(&padapter->rtl8712_fw_ready);
 
50
        if (!firmware) {
 
51
                struct usb_device *udev = padapter->dvobjpriv.pusbdev;
 
52
                struct usb_interface *pusb_intf = padapter->pusb_intf;
 
53
                printk(KERN_ERR "r8712u: Firmware request failed\n");
 
54
                padapter->fw_found = false;
 
55
                usb_put_dev(udev);
 
56
                usb_set_intfdata(pusb_intf, NULL);
 
57
                return;
 
58
        }
 
59
        padapter->fw = firmware;
 
60
        padapter->fw_found = true;
 
61
        /* firmware available - start netdev */
 
62
        register_netdev(padapter->pnetdev);
 
63
}
 
64
 
 
65
static const char firmware_file[] = "rtlwifi/rtl8712u.bin";
 
66
 
 
67
int rtl871x_load_fw(struct _adapter *padapter)
 
68
{
 
69
        struct device *dev = &padapter->dvobjpriv.pusbdev->dev;
48
70
        int rc;
49
 
        const char firmware_file[] = "rtlwifi/rtl8712u.bin";
50
 
        const struct firmware **praw = (const struct firmware **)
51
 
                                       (pphfwfile_hdl);
52
 
        struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)
53
 
                                        (&padapter->dvobjpriv);
54
 
        struct usb_device *pusbdev = pdvobjpriv->pusbdev;
55
71
 
 
72
        init_completion(&padapter->rtl8712_fw_ready);
56
73
        printk(KERN_INFO "r8712u: Loading firmware from \"%s\"\n",
57
74
               firmware_file);
58
 
        rc = request_firmware(praw, firmware_file, &pusbdev->dev);
59
 
        if (rc < 0) {
60
 
                printk(KERN_ERR "r8712u: Unable to load firmware\n");
61
 
                printk(KERN_ERR "r8712u: Install latest linux-firmware\n");
 
75
        rc = request_firmware_nowait(THIS_MODULE, 1, firmware_file, dev,
 
76
                                     GFP_KERNEL, padapter, rtl871x_load_fw_cb);
 
77
        if (rc)
 
78
                printk(KERN_ERR "r8712u: Firmware request error %d\n", rc);
 
79
        return rc;
 
80
}
 
81
MODULE_FIRMWARE("rtlwifi/rtl8712u.bin");
 
82
 
 
83
static u32 rtl871x_open_fw(struct _adapter *padapter, const u8 **ppmappedfw)
 
84
{
 
85
        const struct firmware **praw = &padapter->fw;
 
86
 
 
87
        if (padapter->fw->size > 200000) {
 
88
                printk(KERN_ERR "r8172u: Badfw->size of %d\n",
 
89
                       (int)padapter->fw->size);
62
90
                return 0;
63
91
        }
64
92
        *ppmappedfw = (u8 *)((*praw)->data);
65
93
        return (*praw)->size;
66
94
}
67
 
MODULE_FIRMWARE("rtlwifi/rtl8712u.bin");
68
95
 
69
96
static void fill_fwpriv(struct _adapter *padapter, struct fw_priv *pfwpriv)
70
97
{
142
169
        uint dump_imem_sz, imem_sz, dump_emem_sz, emem_sz; /* max = 49152; */
143
170
        struct fw_hdr fwhdr;
144
171
        u32 ulfilelength;       /* FW file size */
145
 
        void *phfwfile_hdl = NULL;
146
172
        const u8 *pmappedfw = NULL;
147
173
        u8 *ptmpchar = NULL, *ppayload, *ptr;
148
174
        struct tx_desc *ptx_desc;
149
175
        u32 txdscp_sz = sizeof(struct tx_desc);
150
176
        u8 ret = _FAIL;
151
177
 
152
 
        ulfilelength = rtl871x_open_fw(padapter, &phfwfile_hdl, &pmappedfw);
 
178
        ulfilelength = rtl871x_open_fw(padapter, &pmappedfw);
153
179
        if (pmappedfw && (ulfilelength > 0)) {
154
180
                update_fwhdr(&fwhdr, pmappedfw);
155
181
                if (chk_fwhdr(&fwhdr, ulfilelength) == _FAIL)
156
 
                        goto firmware_rel;
 
182
                        return ret;
157
183
                fill_fwpriv(padapter, &fwhdr.fwpriv);
158
184
                /* firmware check ok */
159
185
                maxlen = (fwhdr.img_IMEM_size > fwhdr.img_SRAM_size) ?
161
187
                maxlen += txdscp_sz;
162
188
                ptmpchar = _malloc(maxlen + FWBUFF_ALIGN_SZ);
163
189
                if (ptmpchar == NULL)
164
 
                        goto firmware_rel;
 
190
                        return ret;
165
191
 
166
192
                ptx_desc = (struct tx_desc *)(ptmpchar + FWBUFF_ALIGN_SZ -
167
193
                            ((addr_t)(ptmpchar) & (FWBUFF_ALIGN_SZ - 1)));
297
323
 
298
324
exit_fail:
299
325
        kfree(ptmpchar);
300
 
firmware_rel:
301
 
        release_firmware((struct firmware *)phfwfile_hdl);
302
326
        return ret;
303
327
}
304
328