Commit cdf6ecc5 authored by Wolfram Sang's avatar Wolfram Sang Committed by Greg Kroah-Hartman
Browse files

staging: ks7010: indent ks7010_sdio.c



Unlike the previous patches which are plain indent outcomes, this has
some manual fixups to be not overly strict with the 80 char limit.

Signed-off-by: default avatarWolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 79c2df58
Loading
Loading
Loading
Loading
+460 −347
Original line number Diff line number Diff line
@@ -48,7 +48,8 @@ static struct ks_sdio_model ks_sdio_models[] = {
	},
};

static int ks7910_sdio_probe(struct sdio_func *function, const struct sdio_device_id *device);
static int ks7910_sdio_probe(struct sdio_func *function,
			     const struct sdio_device_id *device);
static void ks7910_sdio_remove(struct sdio_func *function);
static void ks7010_rw_function(struct work_struct *work);
static int ks7010_sdio_read(struct ks_wlan_private *priv, unsigned int address,
@@ -83,7 +84,8 @@ void ks_wlan_hw_sleep_doze_request(struct ks_wlan_private *priv)

	if (atomic_read(&priv->sleepstatus.status) == 0) {
		rw_data = GCR_B_DOZE;
		retval = ks7010_sdio_write(priv, GCR_B, &rw_data, sizeof(rw_data));
		retval =
		    ks7010_sdio_write(priv, GCR_B, &rw_data, sizeof(rw_data));
		if (retval) {
			DPRINTK(1, " error : GCR_B=%02X\n", rw_data);
			goto out;
@@ -92,8 +94,7 @@ void ks_wlan_hw_sleep_doze_request(struct ks_wlan_private *priv)
		DPRINTK(3, "sleep_mode=SLP_SLEEP\n");
		atomic_set(&priv->sleepstatus.status, 1);
		priv->last_doze = jiffies;
	}
	else{
	} else {
		DPRINTK(1, "sleep_mode=%d\n", priv->sleep_mode);
	}

@@ -114,7 +115,8 @@ void ks_wlan_hw_sleep_wakeup_request(struct ks_wlan_private *priv)

	if (atomic_read(&priv->sleepstatus.status) == 1) {
		rw_data = WAKEUP_REQ;
		retval = ks7010_sdio_write(priv, WAKEUP, &rw_data, sizeof(rw_data));
		retval =
		    ks7010_sdio_write(priv, WAKEUP, &rw_data, sizeof(rw_data));
		if (retval) {
			DPRINTK(1, " error : WAKEUP=%02X\n", rw_data);
			goto out;
@@ -123,8 +125,7 @@ void ks_wlan_hw_sleep_wakeup_request(struct ks_wlan_private *priv)
		atomic_set(&priv->sleepstatus.status, 0);
		priv->last_wakeup = jiffies;
		++priv->wakeup_count;
	}
	else{
	} else {
		DPRINTK(1, "sleep_mode=%d\n", priv->sleep_mode);
	}

@@ -133,7 +134,6 @@ out:
	return;
}


void ks_wlan_hw_wakeup_request(struct ks_wlan_private *priv)
{
	unsigned char rw_data;
@@ -142,16 +142,17 @@ void ks_wlan_hw_wakeup_request(struct ks_wlan_private *priv)
	DPRINTK(4, "\n");
	if (atomic_read(&priv->psstatus.status) == PS_SNOOZE) {
		rw_data = WAKEUP_REQ;
		retval = ks7010_sdio_write(priv, WAKEUP, &rw_data, sizeof(rw_data));
		retval =
		    ks7010_sdio_write(priv, WAKEUP, &rw_data, sizeof(rw_data));
		if (retval) {
			DPRINTK(1, " error : WAKEUP=%02X\n", rw_data);
		}
		DPRINTK(4, "wake up : WAKEUP=%02X\n", rw_data);
		priv->last_wakeup = jiffies;
		++priv->wakeup_count;
	}
	else{
		DPRINTK(1,"psstatus=%d\n",atomic_read(&priv->psstatus.status));
	} else {
		DPRINTK(1, "psstatus=%d\n",
			atomic_read(&priv->psstatus.status));
	}
}

@@ -173,43 +174,59 @@ int _ks_wlan_hw_power_save(struct ks_wlan_private *priv)
			case PS_SNOOZE:	/* 4 */
				break;
			default:
			DPRINTK(5,"\n\
				psstatus.status=%d\n\
				psstatus.confirm_wait=%d\n\
				psstatus.snooze_guard=%d\n\
				cnt_txqbody=%d\n",
				DPRINTK(5, "\npsstatus.status=%d\npsstatus.confirm_wait=%d\npsstatus.snooze_guard=%d\ncnt_txqbody=%d\n",
					atomic_read(&priv->psstatus.status),
					atomic_read(&priv->psstatus.confirm_wait),
					atomic_read(&priv->psstatus.snooze_guard),
					cnt_txqbody(priv));

			if(!atomic_read(&priv->psstatus.confirm_wait)&&
			   !atomic_read(&priv->psstatus.snooze_guard)&&
			   !cnt_txqbody(priv)){
				retval = ks7010_sdio_read(priv, INT_PENDING, &rw_data, sizeof(rw_data));
				if (!atomic_read(&priv->psstatus.confirm_wait)
				    && !atomic_read(&priv->psstatus.snooze_guard)
				    && !cnt_txqbody(priv)) {
					retval =
					    ks7010_sdio_read(priv, INT_PENDING,
							     &rw_data,
							     sizeof(rw_data));
					if (retval) {
					DPRINTK(1, " error : INT_PENDING=%02X\n", rw_data);
					queue_delayed_work(priv->ks_wlan_hw.ks7010sdio_wq,&priv->ks_wlan_hw.rw_wq, 1);
						DPRINTK(1,
							" error : INT_PENDING=%02X\n",
							rw_data);
						queue_delayed_work(priv->ks_wlan_hw.ks7010sdio_wq,
								   &priv->ks_wlan_hw.rw_wq, 1);
						break;
					}
					if (!rw_data) {
						rw_data = GCR_B_DOZE;
					retval = ks7010_sdio_write(priv, GCR_B, &rw_data, sizeof(rw_data));
						retval =
						    ks7010_sdio_write(priv,
								      GCR_B,
								      &rw_data,
								      sizeof(rw_data));
						if (retval) {
						DPRINTK(1, " error : GCR_B=%02X\n", rw_data);
						queue_delayed_work(priv->ks_wlan_hw.ks7010sdio_wq,&priv->ks_wlan_hw.rw_wq, 1);
							DPRINTK(1,
								" error : GCR_B=%02X\n",
								rw_data);
							queue_delayed_work
							    (priv->ks_wlan_hw.ks7010sdio_wq,
							     &priv->ks_wlan_hw.rw_wq, 1);
							break;
						}
					DPRINTK(4, "PMG SET!! : GCR_B=%02X\n", rw_data);
					atomic_set(&priv->psstatus.status, PS_SNOOZE);
					DPRINTK(3,"psstatus.status=PS_SNOOZE\n");
				}
				else{
					queue_delayed_work(priv->ks_wlan_hw.ks7010sdio_wq,&priv->ks_wlan_hw.rw_wq, 1);
				}
						DPRINTK(4,
							"PMG SET!! : GCR_B=%02X\n",
							rw_data);
						atomic_set(&priv->psstatus.
							   status, PS_SNOOZE);
						DPRINTK(3,
							"psstatus.status=PS_SNOOZE\n");
					} else {
						queue_delayed_work(priv->ks_wlan_hw.ks7010sdio_wq,
								   &priv->ks_wlan_hw.rw_wq, 1);
					}
			else{
				queue_delayed_work(priv->ks_wlan_hw.ks7010sdio_wq,&priv->ks_wlan_hw.rw_wq, 0);
				} else {
					queue_delayed_work(priv->ks_wlan_hw.
							   ks7010sdio_wq,
							   &priv->ks_wlan_hw.rw_wq,
							   0);
				}
				break;
			}
@@ -222,7 +239,8 @@ int _ks_wlan_hw_power_save(struct ks_wlan_private *priv)

int ks_wlan_hw_power_save(struct ks_wlan_private *priv)
{
	queue_delayed_work(priv->ks_wlan_hw.ks7010sdio_wq,&priv->ks_wlan_hw.rw_wq, 1);
	queue_delayed_work(priv->ks_wlan_hw.ks7010sdio_wq,
			   &priv->ks_wlan_hw.rw_wq, 1);
	return 0;
}

@@ -260,7 +278,8 @@ static int ks7010_sdio_write(struct ks_wlan_private *priv, unsigned int address,
	if (length == 1)	/* CMD52 */
		sdio_writeb(card->func, *buffer, (unsigned int)address, &rc);
	else	/* CMD53 */
		rc = sdio_memcpy_toio(card->func, (unsigned int) address, buffer, length);
		rc = sdio_memcpy_toio(card->func, (unsigned int)address, buffer,
				      length);

	if (rc != 0) {
		printk("sdio error erorr=%d size=%d\n", rc, length);
@@ -272,7 +291,8 @@ static int ks7010_sdio_write(struct ks_wlan_private *priv, unsigned int address,
	return rc;
}

static int enqueue_txdev(struct ks_wlan_private *priv, unsigned char *p, unsigned long size,
static int enqueue_txdev(struct ks_wlan_private *priv, unsigned char *p,
			 unsigned long size,
			 void (*complete_handler) (void *arg1, void *arg2),
			 void *arg1, void *arg2)
{
@@ -306,7 +326,8 @@ static int enqueue_txdev(struct ks_wlan_private *priv, unsigned char *p, unsigne
}

/* write data */
static int write_to_device(struct ks_wlan_private *priv, unsigned char *buffer, unsigned long size )
static int write_to_device(struct ks_wlan_private *priv, unsigned char *buffer,
			   unsigned long size)
{
	int rc, retval;
	unsigned char rw_data;
@@ -327,7 +348,8 @@ static int write_to_device(struct ks_wlan_private *priv, unsigned char *buffer,
	}

	rw_data = WRITE_STATUS_BUSY;
	retval = ks7010_sdio_write(priv, WRITE_STATUS, &rw_data, sizeof(rw_data));
	retval =
	    ks7010_sdio_write(priv, WRITE_STATUS, &rw_data, sizeof(rw_data));
	if (retval) {
		DPRINTK(1, " error : WRITE_STATUS=%02X\n", rw_data);
		return -3;
@@ -343,13 +365,17 @@ static void tx_device_task(void *dev)
	int rc = 0;

	DPRINTK(4, "\n");
	if(cnt_txqbody(priv)>0 && atomic_read(&priv->psstatus.status) != PS_SNOOZE){
	if (cnt_txqbody(priv) > 0
	    && atomic_read(&priv->psstatus.status) != PS_SNOOZE) {
		sp = &priv->tx_dev.tx_dev_buff[priv->tx_dev.qhead];
		if (priv->dev_state >= DEVICE_STATE_BOOT) {
			rc = write_to_device(priv, sp->sendp, sp->size);
			if (rc) {
				DPRINTK(1, "write_to_device error !!(%d)\n", rc);
				queue_delayed_work(priv->ks_wlan_hw.ks7010sdio_wq,&priv->ks_wlan_hw.rw_wq, 1);
				DPRINTK(1, "write_to_device error !!(%d)\n",
					rc);
				queue_delayed_work(priv->ks_wlan_hw.
						   ks7010sdio_wq,
						   &priv->ks_wlan_hw.rw_wq, 1);
				return;
			}

@@ -360,7 +386,8 @@ static void tx_device_task(void *dev)
		inc_txqhead(priv);

		if (cnt_txqbody(priv) > 0) {
			queue_delayed_work(priv->ks_wlan_hw.ks7010sdio_wq,&priv->ks_wlan_hw.rw_wq, 0);
			queue_delayed_work(priv->ks_wlan_hw.ks7010sdio_wq,
					   &priv->ks_wlan_hw.rw_wq, 0);
		}
	}
	return;
@@ -389,7 +416,8 @@ int ks_wlan_hw_tx( struct ks_wlan_private *priv, void *p, unsigned long size,
	spin_unlock(&priv->tx_dev.tx_dev_lock);

	if (cnt_txqbody(priv) > 0) {
		queue_delayed_work(priv->ks_wlan_hw.ks7010sdio_wq,&priv->ks_wlan_hw.rw_wq, 0);
		queue_delayed_work(priv->ks_wlan_hw.ks7010sdio_wq,
				   &priv->ks_wlan_hw.rw_wq, 0);
	}
	return result;
}
@@ -433,7 +461,9 @@ static void ks_wlan_hw_rx(void *dev, uint16_t size)
	}
	rx_buffer = &priv->rx_dev.rx_dev_buff[priv->rx_dev.qtail];

	retval = ks7010_sdio_read(priv, DATA_WINDOW, &rx_buffer->data[0], hif_align_size(size));
	retval =
	    ks7010_sdio_read(priv, DATA_WINDOW, &rx_buffer->data[0],
			     hif_align_size(size));
	if (retval) {
		goto error_out;
	}
@@ -442,12 +472,15 @@ static void ks_wlan_hw_rx(void *dev, uint16_t size)
	if (size > 2046 || size == 0) {
#ifdef KS_WLAN_DEBUG
		if (KS_WLAN_DEBUG > 5)
			print_hex_dump_bytes("INVALID DATA dump: ", DUMP_PREFIX_OFFSET,
			print_hex_dump_bytes("INVALID DATA dump: ",
					     DUMP_PREFIX_OFFSET,
					     rx_buffer->data, 32);
#endif
		/* rx_status update */
		read_status = READ_STATUS_IDLE;
		retval = ks7010_sdio_write(priv, READ_STATUS, &read_status, sizeof(read_status));
		retval =
		    ks7010_sdio_write(priv, READ_STATUS, &read_status,
				      sizeof(read_status));
		if (retval) {
			DPRINTK(1, " error : READ_STATUS=%02X\n", read_status);
		}
@@ -461,7 +494,9 @@ static void ks_wlan_hw_rx(void *dev, uint16_t size)

	/* read status update */
	read_status = READ_STATUS_IDLE;
	retval = ks7010_sdio_write(priv, READ_STATUS, &read_status, sizeof(read_status));
	retval =
	    ks7010_sdio_write(priv, READ_STATUS, &read_status,
			      sizeof(read_status));
	if (retval) {
		DPRINTK(1, " error : READ_STATUS=%02X\n", read_status);
	}
@@ -493,11 +528,11 @@ static void ks7010_rw_function(struct work_struct *work)

	DPRINTK(4, "\n");


	/* wiat after DOZE */
	if (time_after(priv->last_doze + ((30 * HZ) / 1000), jiffies)) {
		DPRINTK(4, "wait after DOZE \n");
		queue_delayed_work(priv->ks_wlan_hw.ks7010sdio_wq,&priv->ks_wlan_hw.rw_wq, 1);
		queue_delayed_work(priv->ks_wlan_hw.ks7010sdio_wq,
				   &priv->ks_wlan_hw.rw_wq, 1);
		return;
	}

@@ -506,7 +541,8 @@ static void ks7010_rw_function(struct work_struct *work)
		DPRINTK(4, "wait after WAKEUP \n");
/*		queue_delayed_work(priv->ks_wlan_hw.ks7010sdio_wq,&priv->ks_wlan_hw.rw_wq,
		(priv->last_wakeup + ((30*HZ)/1000) - jiffies));*/
		printk("wake: %lu %lu\n", priv->last_wakeup + (30* HZ)/1000, jiffies);
		printk("wake: %lu %lu\n", priv->last_wakeup + (30 * HZ) / 1000,
		       jiffies);
		msleep(30);
	}

@@ -516,7 +552,8 @@ static void ks7010_rw_function(struct work_struct *work)
	if (atomic_read(&priv->psstatus.status) == PS_SNOOZE) {
		if (cnt_txqbody(priv) > 0) {
			ks_wlan_hw_wakeup_request(priv);
			queue_delayed_work(priv->ks_wlan_hw.ks7010sdio_wq,&priv->ks_wlan_hw.rw_wq, 1);
			queue_delayed_work(priv->ks_wlan_hw.ks7010sdio_wq,
					   &priv->ks_wlan_hw.rw_wq, 1);
		}
		goto err_out;
	}
@@ -533,15 +570,18 @@ static void ks7010_rw_function(struct work_struct *work)
	}

	/* read (WriteStatus/ReadDataSize FN1:00_0014) */
	retval = ks7010_sdio_read(priv, WSTATUS_RSIZE, &rw_data, sizeof(rw_data));
	retval =
	    ks7010_sdio_read(priv, WSTATUS_RSIZE, &rw_data, sizeof(rw_data));
	if (retval) {
		DPRINTK(1, " error : WSTATUS_RSIZE=%02X psstatus=%d\n", rw_data,atomic_read(&priv->psstatus.status));
		DPRINTK(1, " error : WSTATUS_RSIZE=%02X psstatus=%d\n", rw_data,
			atomic_read(&priv->psstatus.status));
		goto err_out;
	}
	DPRINTK(4, "WSTATUS_RSIZE=%02X\n", rw_data);

	if (rw_data & RSIZE_MASK) {	/* Read schedule */
		ks_wlan_hw_rx((void *)priv, (uint16_t)(((rw_data&RSIZE_MASK)<<4)));
		ks_wlan_hw_rx((void *)priv,
			      (uint16_t) (((rw_data & RSIZE_MASK) << 4)));
	}
	if ((rw_data & WSTATUS_MASK)) {
		tx_device_task((void *)priv);
@@ -554,8 +594,6 @@ err_out:
	return;
}



static void ks_sdio_interrupt(struct sdio_func *func)
{
	int retval;
@@ -568,7 +606,9 @@ static void ks_sdio_interrupt(struct sdio_func *func)
	DPRINTK(4, "\n");

	if (priv->dev_state >= DEVICE_STATE_BOOT) {
		retval = ks7010_sdio_read(priv, INT_PENDING, &status, sizeof(status));
		retval =
		    ks7010_sdio_read(priv, INT_PENDING, &status,
				     sizeof(status));
		if (retval) {
			DPRINTK(1, "read INT_PENDING Failed!!(%d)\n", retval);
			goto intr_out;
@@ -580,66 +620,85 @@ static void ks_sdio_interrupt(struct sdio_func *func)
		/* read (General Communication B register) */
		/* bit5 -> Write Status Idle */
		/* bit2 -> Read Status Busy  */
		if(status&INT_GCR_B || atomic_read(&priv->psstatus.status)==PS_SNOOZE){
			retval = ks7010_sdio_read(priv, GCR_B, &rw_data, sizeof(rw_data));
		if (status & INT_GCR_B
		    || atomic_read(&priv->psstatus.status) == PS_SNOOZE) {
			retval =
			    ks7010_sdio_read(priv, GCR_B, &rw_data,
					     sizeof(rw_data));
			if (retval) {
				DPRINTK(1, " error : GCR_B=%02X\n", rw_data);
				goto intr_out;
			}
			/* DPRINTK(1, "GCR_B=%02X\n", rw_data); */
			if (rw_data == GCR_B_ACTIVE) {
				if(atomic_read(&priv->psstatus.status)==PS_SNOOZE){
					atomic_set(&priv->psstatus.status, PS_WAKEUP);
				if (atomic_read(&priv->psstatus.status) ==
				    PS_SNOOZE) {
					atomic_set(&priv->psstatus.status,
						   PS_WAKEUP);
					priv->wakeup_count = 0;
				}
				complete(&priv->psstatus.wakeup_wait);
			}


		}

		do {
			/* read (WriteStatus/ReadDataSize FN1:00_0014) */
			retval = ks7010_sdio_read(priv, WSTATUS_RSIZE, &rw_data, sizeof(rw_data));
			retval =
			    ks7010_sdio_read(priv, WSTATUS_RSIZE, &rw_data,
					     sizeof(rw_data));
			if (retval) {
				DPRINTK(1, " error : WSTATUS_RSIZE=%02X\n", rw_data);
				DPRINTK(1, " error : WSTATUS_RSIZE=%02X\n",
					rw_data);
				goto intr_out;
			}
			DPRINTK(4, "WSTATUS_RSIZE=%02X\n", rw_data);
			rsize = rw_data & RSIZE_MASK;
			if (rsize) {	/* Read schedule */
				ks_wlan_hw_rx((void *)priv, (uint16_t)(((rsize)<<4)));
				ks_wlan_hw_rx((void *)priv,
					      (uint16_t) (((rsize) << 4)));
			}
			if (rw_data & WSTATUS_MASK) {
#if 0
				if(status&INT_WRITE_STATUS && !cnt_txqbody(priv)){
				if (status & INT_WRITE_STATUS
				    && !cnt_txqbody(priv)) {
					/* dummy write for interrupt clear */
					rw_data = 0;
					retval = ks7010_sdio_write(priv, DATA_WINDOW, &rw_data, sizeof(rw_data));
					retval =
					    ks7010_sdio_write(priv, DATA_WINDOW,
							      &rw_data,
							      sizeof(rw_data));
					if (retval) {
						DPRINTK(1, "write DATA_WINDOW Failed!!(%d)\n",retval);
						DPRINTK(1,
							"write DATA_WINDOW Failed!!(%d)\n",
							retval);
					}
					status &= ~INT_WRITE_STATUS;
				}
				else{
				} else {
#endif
					if (atomic_read(&priv->psstatus.status) == PS_SNOOZE) {
						if (cnt_txqbody(priv)) {
							ks_wlan_hw_wakeup_request(priv);
							queue_delayed_work(priv->ks_wlan_hw.ks7010sdio_wq, &priv->ks_wlan_hw.rw_wq, 1);
							queue_delayed_work
							    (priv->ks_wlan_hw.
							     ks7010sdio_wq,
							     &priv->ks_wlan_hw.
							     rw_wq, 1);
							return;
						}
					}
					else{
					} else {
						tx_device_task((void *)priv);
					}
//				}
#if 0
				}
#endif
			}
		} while (rsize);
	}

 intr_out:
	queue_delayed_work(priv->ks_wlan_hw.ks7010sdio_wq,&priv->ks_wlan_hw.rw_wq, 0);
	queue_delayed_work(priv->ks_wlan_hw.ks7010sdio_wq,
			   &priv->ks_wlan_hw.rw_wq, 0);
	return;
}

@@ -655,7 +714,8 @@ static int trx_device_init( struct ks_wlan_private *priv )
	spin_lock_init(&priv->tx_dev.tx_dev_lock);
	spin_lock_init(&priv->rx_dev.rx_dev_lock);

	tasklet_init(&priv->ks_wlan_hw.rx_bh_task, rx_event_task, (unsigned long)priv);
	tasklet_init(&priv->ks_wlan_hw.rx_bh_task, rx_event_task,
		     (unsigned long)priv);

	return 0;
}
@@ -677,6 +737,7 @@ static void trx_device_exit( struct ks_wlan_private *priv )

	return;
}

static int ks7010_sdio_update_index(struct ks_wlan_private *priv, u32 index)
{
	int rc = 0;
@@ -685,16 +746,26 @@ static int ks7010_sdio_update_index(struct ks_wlan_private *priv, u32 index)
	data_buf = NULL;

	data_buf = kmalloc(sizeof(u32), GFP_KERNEL);
	if(!data_buf){ rc = 1; goto error_out; }
	if (!data_buf) {
		rc = 1;
		goto error_out;
	}

	memcpy(data_buf, &index, sizeof(index));
	retval = ks7010_sdio_write(priv, WRITE_INDEX, data_buf, sizeof(index));
	if(retval){ rc = 2; goto error_out; }
	if (retval) {
		rc = 2;
		goto error_out;
	}

	retval = ks7010_sdio_write(priv, READ_INDEX, data_buf, sizeof(index));
	if(retval){ rc = 3; goto error_out; }
	if (retval) {
		rc = 3;
		goto error_out;
	}
 error_out:
	if(data_buf) kfree(data_buf);
	if (data_buf)
		kfree(data_buf);
	return rc;
}

@@ -707,20 +778,31 @@ static int ks7010_sdio_data_compare(struct ks_wlan_private *priv, u32 address,
	unsigned char *read_buf;
	read_buf = NULL;
	read_buf = kmalloc(ROM_BUFF_SIZE, GFP_KERNEL);
	if(!read_buf){ rc = 1; goto error_out; }
	if (!read_buf) {
		rc = 1;
		goto error_out;
	}
	retval = ks7010_sdio_read(priv, address, read_buf, size);
	if(retval){ rc = 2; goto error_out; }
	if (retval) {
		rc = 2;
		goto error_out;
	}
	retval = memcmp(data, read_buf, size);

	if (retval) {
		DPRINTK(0, "data compare error (%d) \n",retval); rc = 3; goto error_out;
		DPRINTK(0, "data compare error (%d) \n", retval);
		rc = 3;
		goto error_out;
	}
 error_out:
	if(read_buf) kfree(read_buf);
	if (read_buf)
		kfree(read_buf);
	return rc;
}

#include <linux/firmware.h>
static int ks79xx_upload_firmware(struct ks_wlan_private *priv, struct ks_sdio_card *card)
static int ks79xx_upload_firmware(struct ks_wlan_private *priv,
				  struct ks_sdio_card *card)
{
	unsigned int size, offset, n = 0;
	unsigned char *rom_buf;
@@ -733,8 +815,10 @@ static int ks79xx_upload_firmware(struct ks_wlan_private *priv, struct ks_sdio_c

	/* buffer allocate */
	rom_buf = kmalloc(ROM_BUFF_SIZE, GFP_KERNEL);
	if(!rom_buf){ rc = 3; goto error_out0; }

	if (!rom_buf) {
		rc = 3;
		goto error_out0;
	}

	sdio_claim_host(card->func);

@@ -746,11 +830,15 @@ static int ks79xx_upload_firmware(struct ks_wlan_private *priv, struct ks_sdio_c
		goto error_out0;
	}

	if(request_firmware(&fw_entry, priv->reg.rom_file, &priv->ks_wlan_hw.sdio_card->func->dev)!=0){
		DPRINTK(1,"error request_firmware() file=%s\n", priv->reg.rom_file);
	if (request_firmware
	    (&fw_entry, priv->reg.rom_file,
	     &priv->ks_wlan_hw.sdio_card->func->dev) != 0) {
		DPRINTK(1, "error request_firmware() file=%s\n",
			priv->reg.rom_file);
		return 1;
	}
	DPRINTK(4,"success request_firmware() file=%s size=%zu\n", priv->reg.rom_file, fw_entry->size);
	DPRINTK(4, "success request_firmware() file=%s size=%zu\n",
		priv->reg.rom_file, fw_entry->size);
	length = fw_entry->size;

	/* Load Program */
@@ -759,26 +847,38 @@ static int ks79xx_upload_firmware(struct ks_wlan_private *priv, struct ks_sdio_c
		if (length >= ROM_BUFF_SIZE) {
			size = ROM_BUFF_SIZE;
			length = length - ROM_BUFF_SIZE;
		}
		else{
		} else {
			size = length;
			length = 0;
		}
		DPRINTK(4, "size = %d\n", size);
		if(size == 0) break;
		if (size == 0)
			break;
		memcpy(rom_buf, fw_entry->data + n, size);
		/* Update write index */
		offset = n;
		retval = ks7010_sdio_update_index(priv, KS7010_IRAM_ADDRESS+offset);
		if(retval){ rc = 6; goto error_out1; }
		retval =
		    ks7010_sdio_update_index(priv,
					     KS7010_IRAM_ADDRESS + offset);
		if (retval) {
			rc = 6;
			goto error_out1;
		}

		/* Write data */
		retval = ks7010_sdio_write(priv, DATA_WINDOW, rom_buf, size);
		if(retval){ rc = 8; goto error_out1; }
		if (retval) {
			rc = 8;
			goto error_out1;
		}

		/* compare */
		retval = ks7010_sdio_data_compare(priv, DATA_WINDOW, rom_buf, size);
		if(retval){ rc = 9; goto error_out1; }
		retval =
		    ks7010_sdio_data_compare(priv, DATA_WINDOW, rom_buf, size);
		if (retval) {
			rc = 9;
			goto error_out1;
		}
		n += size;

	} while (size);
@@ -795,9 +895,14 @@ static int ks79xx_upload_firmware(struct ks_wlan_private *priv, struct ks_sdio_c
	/* Firmware running check */
	for (n = 0; n < 50; ++n) {
		mdelay(10);	/* wait_ms(10); */
		retval = ks7010_sdio_read(priv, GCR_A, &rw_data, sizeof(rw_data));
		if(retval){ rc = 11; goto error_out1; }
		if(rw_data == GCR_A_RUN) break;
		retval =
		    ks7010_sdio_read(priv, GCR_A, &rw_data, sizeof(rw_data));
		if (retval) {
			rc = 11;
			goto error_out1;
		}
		if (rw_data == GCR_A_RUN)
			break;
	}
	DPRINTK(4, "firmware wakeup (%d)!!!!\n", n);
	if ((50) <= n) {
@@ -831,7 +936,8 @@ static void ks7010_card_init(struct ks_wlan_private *priv)

	DPRINTK(5, "hostif_sme_enqueu()\n");

	if(!wait_for_completion_interruptible_timeout(&priv->confirm_wait,5*HZ)){
	if (!wait_for_completion_interruptible_timeout
	    (&priv->confirm_wait, 5 * HZ)) {
		DPRINTK(1, "wait time out!! SME_START\n");
	}

@@ -858,7 +964,8 @@ static void ks7010_card_init(struct ks_wlan_private *priv)
	hostif_sme_enqueue(priv, SME_MODE_SET_REQUEST);
	hostif_sme_enqueue(priv, SME_START_REQUEST);

	if(!wait_for_completion_interruptible_timeout(&priv->confirm_wait,5*HZ)){
	if (!wait_for_completion_interruptible_timeout
	    (&priv->confirm_wait, 5 * HZ)) {
		DPRINTK(1, "wait time out!! wireless parameter set\n");
	}

@@ -867,8 +974,7 @@ static void ks7010_card_init(struct ks_wlan_private *priv)
		priv->dev_state = DEVICE_STATE_READY;
		reg_net = register_netdev(priv->net_dev);
		DPRINTK(3, "register_netdev=%d\n", reg_net);
	}
	else {
	} else {
		DPRINTK(1, "dev_state=%d\n", priv->dev_state);
	}
}
@@ -880,11 +986,11 @@ static struct sdio_driver ks7010_sdio_driver = {
	.remove = ks7910_sdio_remove,
};


extern int ks_wlan_net_start(struct net_device *dev);
extern int ks_wlan_net_stop(struct net_device *dev);

static int ks7910_sdio_probe(struct sdio_func *func, const struct sdio_device_id *device)
static int ks7910_sdio_probe(struct sdio_func *func,
			     const struct sdio_device_id *device)
{
	struct ks_wlan_private *priv;
	struct ks_sdio_card *card;
@@ -897,7 +1003,6 @@ static int ks7910_sdio_probe(struct sdio_func *func, const struct sdio_device_id
	priv = NULL;
	netdev = NULL;


	/* initilize ks_sdio_card */
	card = kzalloc(sizeof(struct ks_sdio_card), GFP_KERNEL);
	if (!card)
@@ -920,7 +1025,6 @@ static int ks7910_sdio_probe(struct sdio_func *func, const struct sdio_device_id

	card->firmware = ks_sdio_models[i].firmware;


	/*** Initialize  SDIO ***/
	sdio_claim_host(func);

@@ -929,7 +1033,8 @@ static int ks7910_sdio_probe(struct sdio_func *func, const struct sdio_device_id

	/* function blocksize set */
	ret = sdio_set_block_size(func, KS7010_IO_BLOCK_SIZE);
	DPRINTK(5, "multi_block=%d sdio_set_block_size()=%d %d\n", func->card->cccr.multi_block, func->cur_blksize,  ret);
	DPRINTK(5, "multi_block=%d sdio_set_block_size()=%d %d\n",
		func->card->cccr.multi_block, func->cur_blksize, ret);

	/* Allocate the slot current */

@@ -957,9 +1062,7 @@ static int ks7910_sdio_probe(struct sdio_func *func, const struct sdio_device_id
	sdio_set_drvdata(func, card);

	DPRINTK(5, "class = 0x%X, vendor = 0x%X, "
		"device = 0x%X\n",
		func->class, func->vendor, func->device);

		"device = 0x%X\n", func->class, func->vendor, func->device);

	/* private memory allocate */
	netdev = alloc_etherdev(sizeof(*priv));
@@ -1006,14 +1109,18 @@ static int ks7910_sdio_probe(struct sdio_func *func, const struct sdio_device_id
	/* Read config file */
	ret = ks_wlan_read_config_file(priv);
	if (ret) {
		printk(KERN_ERR "ks79xx: read configuration file failed !! retern code = %d\n", ret);
		printk(KERN_ERR
		       "ks79xx: read configuration file failed !! retern code = %d\n",
		       ret);
		goto error_free_read_buf;
	}

	/* Upload firmware */
	ret = ks79xx_upload_firmware(priv, card);	/* firmware load */
	if (ret) {
		printk(KERN_ERR "ks79xx: firmware load failed !! retern code = %d\n", ret);
		printk(KERN_ERR
		       "ks79xx: firmware load failed !! retern code = %d\n",
		       ret);
		goto error_free_read_buf;
	}

@@ -1028,7 +1135,6 @@ static int ks7910_sdio_probe(struct sdio_func *func, const struct sdio_device_id
	}
	DPRINTK(4, " clear Interrupt : INT_PENDING=%02X\n", rw_data);


	/* enable ks7010sdio interrupt (INT_GCR_B|INT_READ_STATUS|INT_WRITE_STATUS) */
	rw_data = (INT_GCR_B | INT_READ_STATUS | INT_WRITE_STATUS);
	sdio_claim_host(func);
@@ -1100,16 +1206,21 @@ static void ks7910_sdio_remove(struct sdio_func *func)
		/* send stop request to MAC */
		{
			struct hostif_stop_request_t *pp;
			pp = (struct hostif_stop_request_t *)kzalloc(hif_align_size(sizeof(*pp)), GFP_KERNEL );
			pp = (struct hostif_stop_request_t *)
			    kzalloc(hif_align_size(sizeof(*pp)), GFP_KERNEL);
			if (pp == NULL) {
				DPRINTK(3, "allocate memory failed..\n");
				return;	/* to do goto ni suru */
			}
			pp->header.size	= cpu_to_le16((uint16_t)(sizeof(*pp)-sizeof(pp->header.size)));
			pp->header.size =
			    cpu_to_le16((uint16_t)
					(sizeof(*pp) -
					 sizeof(pp->header.size)));
			pp->header.event = cpu_to_le16((uint16_t) HIF_STOP_REQ);

			sdio_claim_host(func);
			write_to_device(priv, (unsigned char *) pp, hif_align_size(sizeof(*pp)));
			write_to_device(priv, (unsigned char *)pp,
					hif_align_size(sizeof(*pp)));
			sdio_release_host(func);
			kfree(pp);
		}
@@ -1119,7 +1230,8 @@ static void ks7910_sdio_remove(struct sdio_func *func)
			flush_workqueue(priv->ks_wlan_hw.ks7010sdio_wq);
			destroy_workqueue(priv->ks_wlan_hw.ks7010sdio_wq);
		}
		DPRINTK(1, "destroy_workqueue(priv->ks_wlan_hw.ks7010sdio_wq);\n");
		DPRINTK(1,
			"destroy_workqueue(priv->ks_wlan_hw.ks7010sdio_wq);\n");

		hostif_exit(priv);
		DPRINTK(1, "hostif_exit\n");
@@ -1148,7 +1260,6 @@ static void ks7910_sdio_remove(struct sdio_func *func)
	kfree(card);
	DPRINTK(1, "kfree()\n");


	DPRINTK(5, " Bye !!\n");
	return;
}
@@ -1160,7 +1271,9 @@ static int __init ks7010_sdio_init( void )
	/* register with bus driver core */
	status = sdio_register_driver(&ks7010_sdio_driver);
	if (status != 0) {
		DPRINTK(1,"ks79xx_sdio : failed to register with bus driver, %d\n", status );
		DPRINTK(1,
			"ks79xx_sdio : failed to register with bus driver, %d\n",
			status);
	}
	return status;
}