aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/slicoss/slicoss.c
diff options
context:
space:
mode:
authorLior Dotan <liodot@gmail.com>2008-11-05 09:02:20 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2009-01-06 16:52:08 -0500
commit470c5736fffa16923a3d27a0f365b691086a014d (patch)
tree66e9d8e935a7642d2842fbc9afd7f275f426f9b9 /drivers/staging/slicoss/slicoss.c
parent66615321f59c6ff98b7bf2e9a3caf04ff30c031b (diff)
Staging: slicoss: use request_firmware
This should make the driver use request_firmware() instead of a static firmware. Some obvious things are missing: 1) The unneeded header files are not removed yet. This is to keep the patch size small. 2) The .bin files are missing so the driver doesn't have what to load. 3) Testing. None of this was tested. It does compiles OK though :) Signed-off-by: Lior Dotan <liodot@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/slicoss/slicoss.c')
-rw-r--r--drivers/staging/slicoss/slicoss.c77
1 files changed, 53 insertions, 24 deletions
diff --git a/drivers/staging/slicoss/slicoss.c b/drivers/staging/slicoss/slicoss.c
index d256aef9c43..bf7da8f898a 100644
--- a/drivers/staging/slicoss/slicoss.c
+++ b/drivers/staging/slicoss/slicoss.c
@@ -94,6 +94,7 @@
94#include <linux/module.h> 94#include <linux/module.h>
95#include <linux/moduleparam.h> 95#include <linux/moduleparam.h>
96 96
97#include <linux/firmware.h>
97#include <linux/types.h> 98#include <linux/types.h>
98#include <linux/dma-mapping.h> 99#include <linux/dma-mapping.h>
99#include <linux/mii.h> 100#include <linux/mii.h>
@@ -105,15 +106,6 @@
105 106
106#include <linux/uaccess.h> 107#include <linux/uaccess.h>
107#include "slicinc.h" 108#include "slicinc.h"
108#include "gbdownload.h"
109#include "gbrcvucode.h"
110#include "oasisrcvucode.h"
111
112#ifdef DEBUG_MICROCODE
113#include "oasisdbgdownload.h"
114#else
115#include "oasisdownload.h"
116#endif
117 109
118#if SLIC_DUMP_ENABLED 110#if SLIC_DUMP_ENABLED
119#include "slicdump.h" 111#include "slicdump.h"
@@ -2186,6 +2178,9 @@ static void slic_card_cleanup(struct sliccard *card)
2186 2178
2187static int slic_card_download_gbrcv(struct adapter *adapter) 2179static int slic_card_download_gbrcv(struct adapter *adapter)
2188{ 2180{
2181 const struct firmware *fw;
2182 const char *file = "";
2183 int ret;
2189 __iomem struct slic_regs *slic_regs = adapter->slic_regs; 2184 __iomem struct slic_regs *slic_regs = adapter->slic_regs;
2190 u32 codeaddr; 2185 u32 codeaddr;
2191 unsigned char *instruction = NULL; 2186 unsigned char *instruction = NULL;
@@ -2193,12 +2188,32 @@ static int slic_card_download_gbrcv(struct adapter *adapter)
2193 2188
2194 switch (adapter->devid) { 2189 switch (adapter->devid) {
2195 case SLIC_2GB_DEVICE_ID: 2190 case SLIC_2GB_DEVICE_ID:
2196 instruction = (unsigned char *)&OasisRcvUCode[0]; 2191 file = "oasis_rcv.bin";
2197 rcvucodelen = OasisRcvUCodeLen;
2198 break; 2192 break;
2199 case SLIC_1GB_DEVICE_ID: 2193 case SLIC_1GB_DEVICE_ID:
2200 instruction = (unsigned char *)&GBRcvUCode[0]; 2194 file = "gb_rcv.bin";
2201 rcvucodelen = GBRcvUCodeLen; 2195 break;
2196 default:
2197 ASSERT(0);
2198 break;
2199 }
2200
2201 ret = request_firmware(&fw, file, &adapter->pcidev->dev);
2202 if (ret) {
2203 printk(KERN_ERR "SLICOSS: Failed to load firmware %s\n", file);
2204 return ret;
2205 }
2206
2207 instruction = (unsigned char *)fw->data;
2208 rcvucodelen = fw->size;
2209 switch (adapter->devid) {
2210 case SLIC_2GB_DEVICE_ID:
2211 if (rcvucodelen != OasisRcvUCodeLen)
2212 return -EINVAL;
2213 break;
2214 case SLIC_1GB_DEVICE_ID:
2215 if (rcvucodelen != GBRcvUCodeLen)
2216 return -EINVAL;
2202 break; 2217 break;
2203 default: 2218 default:
2204 ASSERT(0); 2219 ASSERT(0);
@@ -2225,13 +2240,16 @@ static int slic_card_download_gbrcv(struct adapter *adapter)
2225 } 2240 }
2226 2241
2227 /* download finished */ 2242 /* download finished */
2243 release_firmware(fw);
2228 WRITE_REG(slic_regs->slic_rcv_wcs, SLIC_RCVWCS_FINISH, FLUSH); 2244 WRITE_REG(slic_regs->slic_rcv_wcs, SLIC_RCVWCS_FINISH, FLUSH);
2229
2230 return 0; 2245 return 0;
2231} 2246}
2232 2247
2233static int slic_card_download(struct adapter *adapter) 2248static int slic_card_download(struct adapter *adapter)
2234{ 2249{
2250 const struct firmware *fw;
2251 const char *file = "";
2252 int ret;
2235 u32 section; 2253 u32 section;
2236 int thissectionsize; 2254 int thissectionsize;
2237 int codeaddr; 2255 int codeaddr;
@@ -2255,6 +2273,7 @@ static int slic_card_download(struct adapter *adapter)
2255 case SLIC_2GB_DEVICE_ID: 2273 case SLIC_2GB_DEVICE_ID:
2256/* DBG_MSG ("slicoss: %s devid==SLIC_2GB_DEVICE_ID sections[%x]\n", 2274/* DBG_MSG ("slicoss: %s devid==SLIC_2GB_DEVICE_ID sections[%x]\n",
2257 __func__, (uint) ONumSections); */ 2275 __func__, (uint) ONumSections); */
2276 file = "slic_oasis.bin";
2258 numsects = ONumSections; 2277 numsects = ONumSections;
2259 for (i = 0; i < numsects; i++) { 2278 for (i = 0; i < numsects; i++) {
2260 sectsize[i] = OSectionSize[i]; 2279 sectsize[i] = OSectionSize[i];
@@ -2264,6 +2283,7 @@ static int slic_card_download(struct adapter *adapter)
2264 case SLIC_1GB_DEVICE_ID: 2283 case SLIC_1GB_DEVICE_ID:
2265/* DBG_MSG ("slicoss: %s devid==SLIC_1GB_DEVICE_ID sections[%x]\n", 2284/* DBG_MSG ("slicoss: %s devid==SLIC_1GB_DEVICE_ID sections[%x]\n",
2266 __func__, (uint) MNumSections); */ 2285 __func__, (uint) MNumSections); */
2286 file = "slic_mojave.bin";
2267 numsects = MNumSections; 2287 numsects = MNumSections;
2268 for (i = 0; i < numsects; i++) { 2288 for (i = 0; i < numsects; i++) {
2269 sectsize[i] = MSectionSize[i]; 2289 sectsize[i] = MSectionSize[i];
@@ -2274,26 +2294,33 @@ static int slic_card_download(struct adapter *adapter)
2274 ASSERT(0); 2294 ASSERT(0);
2275 break; 2295 break;
2276 } 2296 }
2297 ret = request_firmware(&fw, file, &adapter->pcidev->dev);
2298 if (ret) {
2299 printk(KERN_ERR "SLICOSS: Failed to load firmware %s\n", file);
2300 return ret;
2301 }
2277 2302
2278 ASSERT(numsects <= 3); 2303 ASSERT(numsects <= 3);
2279 2304
2280 for (section = 0; section < numsects; section++) { 2305 for (section = 0; section < numsects; section++) {
2281 switch (adapter->devid) { 2306 switch (adapter->devid) {
2282 case SLIC_2GB_DEVICE_ID: 2307 case SLIC_2GB_DEVICE_ID:
2283 instruction = (u32 *) &OasisUCode[section][0]; 2308 instruction = (u32 *)(fw->data + (SECTION_SIZE *
2309 section));
2284 baseaddress = sectstart[section]; 2310 baseaddress = sectstart[section];
2285 thissectionsize = sectsize[section] >> 3; 2311 thissectionsize = sectsize[section] >> 3;
2286 lastinstruct = 2312 lastinstruct =
2287 (u32 *) &OasisUCode[section][sectsize[section] - 2313 (u32 *)(fw->data + (SECTION_SIZE * section) +
2288 8]; 2314 sectsize[section] - 8);
2289 break; 2315 break;
2290 case SLIC_1GB_DEVICE_ID: 2316 case SLIC_1GB_DEVICE_ID:
2291 instruction = (u32 *) &MojaveUCode[section][0]; 2317 instruction = (u32 *)(fw->data + (SECTION_SIZE *
2318 section));
2292 baseaddress = sectstart[section]; 2319 baseaddress = sectstart[section];
2293 thissectionsize = sectsize[section] >> 3; 2320 thissectionsize = sectsize[section] >> 3;
2294 lastinstruct = 2321 lastinstruct =
2295 (u32 *) &MojaveUCode[section][sectsize[section] 2322 (u32 *)(fw->data + (SECTION_SIZE * section) +
2296 - 8]; 2323 sectsize[section] - 8);
2297 break; 2324 break;
2298 default: 2325 default:
2299 ASSERT(0); 2326 ASSERT(0);
@@ -2329,10 +2356,12 @@ static int slic_card_download(struct adapter *adapter)
2329 for (section = 0; section < numsects; section++) { 2356 for (section = 0; section < numsects; section++) {
2330 switch (adapter->devid) { 2357 switch (adapter->devid) {
2331 case SLIC_2GB_DEVICE_ID: 2358 case SLIC_2GB_DEVICE_ID:
2332 instruction = (u32 *)&OasisUCode[section][0]; 2359 instruction = (u32 *)fw->data + (SECTION_SIZE *
2360 section);
2333 break; 2361 break;
2334 case SLIC_1GB_DEVICE_ID: 2362 case SLIC_1GB_DEVICE_ID:
2335 instruction = (u32 *)&MojaveUCode[section][0]; 2363 instruction = (u32 *)fw->data + (SECTION_SIZE *
2364 section);
2336 break; 2365 break;
2337 default: 2366 default:
2338 ASSERT(0); 2367 ASSERT(0);
@@ -2374,13 +2403,13 @@ static int slic_card_download(struct adapter *adapter)
2374 thissectionsize[%x] failure[%x]\n", 2403 thissectionsize[%x] failure[%x]\n",
2375 __func__, codeaddr, thissectionsize, 2404 __func__, codeaddr, thissectionsize,
2376 failure); 2405 failure);
2377 2406 release_firmware(fw);
2378 return -EIO; 2407 return -EIO;
2379 } 2408 }
2380 } 2409 }
2381 } 2410 }
2382/* DBG_MSG ("slicoss: Compare done\n");*/ 2411/* DBG_MSG ("slicoss: Compare done\n");*/
2383 2412 release_firmware(fw);
2384 /* Everything OK, kick off the card */ 2413 /* Everything OK, kick off the card */
2385 mdelay(10); 2414 mdelay(10);
2386 WRITE_REG(slic_regs->slic_wcs, SLIC_WCS_START, FLUSH); 2415 WRITE_REG(slic_regs->slic_wcs, SLIC_WCS_START, FLUSH);