Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 197211
b: refs/heads/master
c: 199ef62
h: refs/heads/master
i:
  197209: 4fd7dcf
  197207: deb466f
v: v3
  • Loading branch information
Florian Schilhabel authored and Greg Kroah-Hartman committed May 11, 2010
1 parent fc2ada3 commit 90f1cef
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 76 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 694a98073f83ce1c14e3c0bba182bfeba5c44f01
refs/heads/master: 199ef62a287b429a8fa3b7dc5ae6b69f607bf324
135 changes: 62 additions & 73 deletions trunk/drivers/staging/rtl8192su/r8192S_firmware.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,118 +31,107 @@
// Code size
// Created by Roger, 2008.04.10.
//
bool FirmwareDownloadCode(struct net_device *dev, u8 * code_virtual_address,u32 buffer_len)
bool FirmwareDownloadCode(struct net_device *dev,
u8 *code_virtual_address,
u32 buffer_len)
{
struct r8192_priv *priv = ieee80211_priv(dev);
bool rt_status = true;
u16 frag_threshold = MAX_FIRMWARE_CODE_SIZE; //Fragmentation might be required in 90/92 but not in 92S
u16 frag_length, frag_offset = 0;
struct sk_buff *skb;
unsigned char *seg_ptr;
cb_desc *tcb_desc;
u8 bLastIniPkt = 0;
u16 ExtraDescOffset = 0;


RT_TRACE(COMP_FIRMWARE, "--->FirmwareDownloadCode()\n" );

//MAX_TRANSMIT_BUFFER_SIZE
if(buffer_len >= MAX_FIRMWARE_CODE_SIZE-USB_HWDESC_HEADER_LEN)
{
RT_TRACE(COMP_ERR, "Size over MAX_FIRMWARE_CODE_SIZE! \n");
struct r8192_priv *priv = ieee80211_priv(dev);
bool rt_status = true;
/* Fragmentation might be required in 90/92 but not in 92S */
u16 frag_threshold = MAX_FIRMWARE_CODE_SIZE;
u16 frag_length, frag_offset = 0;
struct sk_buff *skb;
unsigned char *seg_ptr;
cb_desc *tcb_desc;
u8 bLastIniPkt = 0;
u16 ExtraDescOffset = 0;

if (buffer_len >= MAX_FIRMWARE_CODE_SIZE - USB_HWDESC_HEADER_LEN) {
RT_TRACE(COMP_ERR, "(%s): Firmware exceeds"
" MAX_FIRMWARE_CODE_SIZE\n", __func__);
goto cmdsend_downloadcode_fail;
}

ExtraDescOffset = USB_HWDESC_HEADER_LEN;

do {
if((buffer_len-frag_offset) > frag_threshold)
{
frag_length = frag_threshold + ExtraDescOffset;
else {
frag_length = (u16)(buffer_len -
frag_offset + ExtraDescOffset);
bLastIniPkt = 1;
}
else
{
frag_length = (u16)(buffer_len - frag_offset + ExtraDescOffset);
bLastIniPkt = 1;
}

/* Allocate skb buffer to contain firmware info and tx descriptor info. */
/*
* Allocate skb buffer to contain firmware info
* and tx descriptor info.
*/
skb = dev_alloc_skb(frag_length);
memcpy((unsigned char *)(skb->cb),&dev,sizeof(dev));
if (skb == NULL) {
RT_TRACE(COMP_ERR, "(%s): unable to alloc skb buffer\n",
__func__);
goto cmdsend_downloadcode_fail;
}
memcpy((unsigned char *)(skb->cb), &dev, sizeof(dev));

tcb_desc = (cb_desc*)(skb->cb + MAX_DEV_ADDR_SIZE);
tcb_desc->queue_index = TXCMD_QUEUE;
tcb_desc->bCmdOrInit = DESC_PACKET_TYPE_INIT;
tcb_desc->bLastIniPkt = bLastIniPkt;

skb_reserve(skb, ExtraDescOffset);
seg_ptr = (u8 *)skb_put(skb, (u32)(frag_length-ExtraDescOffset));
memcpy(seg_ptr, code_virtual_address+frag_offset, (u32)(frag_length-ExtraDescOffset));

tcb_desc->txbuf_size= frag_length;
seg_ptr = (u8 *)skb_put(skb,
(u32)(frag_length - ExtraDescOffset));

if(!priv->ieee80211->check_nic_enough_desc(dev,tcb_desc->queue_index)||
(!skb_queue_empty(&priv->ieee80211->skb_waitQ[tcb_desc->queue_index]))||\
(priv->ieee80211->queue_stop) )
{
memcpy(seg_ptr, code_virtual_address + frag_offset,
(u32)(frag_length-ExtraDescOffset));

tcb_desc->txbuf_size = frag_length;

if (!priv->ieee80211->check_nic_enough_desc(dev, tcb_desc->queue_index) ||
(!skb_queue_empty(&priv->ieee80211->skb_waitQ[tcb_desc->queue_index])) ||
(priv->ieee80211->queue_stop)) {
RT_TRACE(COMP_FIRMWARE,"=====================================================> tx full!\n");
skb_queue_tail(&priv->ieee80211->skb_waitQ[tcb_desc->queue_index], skb);
}
else
{
priv->ieee80211->softmac_hard_start_xmit(skb,dev);
}
} else
priv->ieee80211->softmac_hard_start_xmit(skb, dev);

frag_offset += (frag_length - ExtraDescOffset);

}while(frag_offset < buffer_len);

} while (frag_offset < buffer_len);
return rt_status ;


cmdsend_downloadcode_fail:
rt_status = false;
RT_TRACE(COMP_ERR, "CmdSendDownloadCode fail !!\n");
RT_TRACE(COMP_ERR, "(%s): failed\n", __func__);
return rt_status;

}


RT_STATUS
FirmwareEnableCPU(struct net_device *dev)
RT_STATUS FirmwareEnableCPU(struct net_device *dev)
{
RT_STATUS rtStatus = RT_STATUS_SUCCESS;
u8 tmpU1b, CPUStatus = 0;
u16 tmpU2b;
u32 iCheckTime = 200;

RT_STATUS rtStatus = RT_STATUS_SUCCESS;
u8 tmpU1b, CPUStatus = 0;
u16 tmpU2b;
u32 iCheckTime = 200;

RT_TRACE(COMP_FIRMWARE, "-->FirmwareEnableCPU()\n" );
// Enable CPU.
/* Enable CPU. */
tmpU1b = read_nic_byte(dev, SYS_CLKR);
write_nic_byte(dev, SYS_CLKR, (tmpU1b|SYS_CPU_CLKSEL)); //AFE source

/* AFE source */
write_nic_byte(dev, SYS_CLKR, (tmpU1b|SYS_CPU_CLKSEL));
tmpU2b = read_nic_word(dev, SYS_FUNC_EN);
write_nic_word(dev, SYS_FUNC_EN, (tmpU2b|FEN_CPUEN));

//Polling IMEM Ready after CPU has refilled.
do
{
/* Poll IMEM Ready after CPU has refilled. */
do {
CPUStatus = read_nic_byte(dev, TCR);
if(CPUStatus& IMEM_RDY)
{
RT_TRACE(COMP_FIRMWARE, "IMEM Ready after CPU has refilled.\n");
if (CPUStatus & IMEM_RDY)
/* success */
break;
}

//usleep(100);
udelay(100);
}while(iCheckTime--);

if(!(CPUStatus & IMEM_RDY))
return RT_STATUS_FAILURE;

RT_TRACE(COMP_FIRMWARE, "<--FirmwareEnableCPU(): rtStatus(%#x)\n", rtStatus);
} while (iCheckTime--);
if (!(CPUStatus & IMEM_RDY)) {
RT_TRACE(COMP_ERR, "(%s): failed to enable CPU\n", __func__);
rtStatus = RT_STATUS_FAILURE;
}
return rtStatus;
}

Expand Down
2 changes: 0 additions & 2 deletions trunk/drivers/staging/rtl8192su/r8192U_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1296,7 +1296,6 @@ static int rtl8192_rx_initiate(struct net_device*dev)
kfree_skb(skb);
break;
}
// printk("nomal packet IN request!\n");
usb_fill_bulk_urb(entry, priv->udev,
usb_rcvbulkpipe(priv->udev, 3), skb_tail_pointer(skb),
RX_URB_SIZE, rtl8192_rx_isr, skb);
Expand All @@ -1310,7 +1309,6 @@ static int rtl8192_rx_initiate(struct net_device*dev)

/* command packet rx procedure */
while (skb_queue_len(&priv->rx_queue) < MAX_RX_URB + 3) {
// printk("command packet IN request!\n");
skb = __dev_alloc_skb(RX_URB_SIZE ,GFP_KERNEL);
if (!skb)
break;
Expand Down
6 changes: 6 additions & 0 deletions trunk/drivers/staging/rtl8192su/r819xU_cmdpkt.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,12 @@ bool SendTxCommandPacket(struct net_device *dev, void *pData, u32 DataLen)
* (It is shared by CmdQ, MgntQ, and USB coalesce DataQ)
*/
skb = dev_alloc_skb(USB_HWDESC_HEADER_LEN + DataLen + 4);
if (skb == NULL) {
RT_TRACE(COMP_ERR, "(%s): unable to alloc skb buffer\n",
__func__);
rtStatus = false;
return rtStatus;
}
memcpy((unsigned char *)(skb->cb), &dev, sizeof(dev));
tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
tcb_desc->queue_index = TXCMD_QUEUE;
Expand Down

0 comments on commit 90f1cef

Please sign in to comment.