|
@@ -1530,286 +1530,318 @@ static int ft1000_dsp_prov(void *arg)
|
|
return STATUS_SUCCESS;
|
|
return STATUS_SUCCESS;
|
|
}
|
|
}
|
|
|
|
|
|
-static int ft1000_proc_drvmsg (struct ft1000_device *dev, u16 size) {
|
|
|
|
|
|
+static int ft1000_proc_drvmsg(struct ft1000_device *dev, u16 size)
|
|
|
|
+{
|
|
struct ft1000_info *info = netdev_priv(dev->net);
|
|
struct ft1000_info *info = netdev_priv(dev->net);
|
|
- u16 msgtype;
|
|
|
|
- u16 tempword;
|
|
|
|
|
|
+ u16 msgtype;
|
|
|
|
+ u16 tempword;
|
|
struct media_msg *pmediamsg;
|
|
struct media_msg *pmediamsg;
|
|
struct dsp_init_msg *pdspinitmsg;
|
|
struct dsp_init_msg *pdspinitmsg;
|
|
struct drv_msg *pdrvmsg;
|
|
struct drv_msg *pdrvmsg;
|
|
- u16 i;
|
|
|
|
|
|
+ u16 i;
|
|
struct pseudo_hdr *ppseudo_hdr;
|
|
struct pseudo_hdr *ppseudo_hdr;
|
|
- u16 *pmsg;
|
|
|
|
- u16 status;
|
|
|
|
- union {
|
|
|
|
- u8 byte[2];
|
|
|
|
- u16 wrd;
|
|
|
|
- } convert;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- char *cmdbuffer = kmalloc(1600, GFP_KERNEL);
|
|
|
|
- if (!cmdbuffer)
|
|
|
|
- return STATUS_FAILURE;
|
|
|
|
-
|
|
|
|
- status = ft1000_read_dpram32(dev, 0x200, cmdbuffer, size);
|
|
|
|
|
|
+ u16 *pmsg;
|
|
|
|
+ u16 status;
|
|
|
|
+ union {
|
|
|
|
+ u8 byte[2];
|
|
|
|
+ u16 wrd;
|
|
|
|
+ } convert;
|
|
|
|
|
|
|
|
+ char *cmdbuffer = kmalloc(1600, GFP_KERNEL);
|
|
|
|
+ if (!cmdbuffer)
|
|
|
|
+ return STATUS_FAILURE;
|
|
|
|
|
|
|
|
+ status = ft1000_read_dpram32(dev, 0x200, cmdbuffer, size);
|
|
|
|
|
|
#ifdef JDEBUG
|
|
#ifdef JDEBUG
|
|
- DEBUG("ft1000_proc_drvmsg:cmdbuffer\n");
|
|
|
|
- for(i = 0; i < size; i+=5)
|
|
|
|
- {
|
|
|
|
- if( (i + 5) < size )
|
|
|
|
- DEBUG("0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", cmdbuffer[i], cmdbuffer[i+1], cmdbuffer[i+2], cmdbuffer[i+3], cmdbuffer[i+4]);
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- for (j = i; j < size; j++)
|
|
|
|
- DEBUG("0x%x ", cmdbuffer[j]);
|
|
|
|
- DEBUG("\n");
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ DEBUG("ft1000_proc_drvmsg:cmdbuffer\n");
|
|
|
|
+ for (i = 0; i < size; i += 5) {
|
|
|
|
+ if ((i + 5) < size)
|
|
|
|
+ DEBUG("0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", cmdbuffer[i],
|
|
|
|
+ cmdbuffer[i + 1], cmdbuffer[i + 2],
|
|
|
|
+ cmdbuffer[i + 3], cmdbuffer[i + 4]);
|
|
|
|
+ else {
|
|
|
|
+ for (j = i; j < size; j++)
|
|
|
|
+ DEBUG("0x%x ", cmdbuffer[j]);
|
|
|
|
+ DEBUG("\n");
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
#endif
|
|
#endif
|
|
pdrvmsg = (struct drv_msg *)&cmdbuffer[2];
|
|
pdrvmsg = (struct drv_msg *)&cmdbuffer[2];
|
|
- msgtype = ntohs(pdrvmsg->type);
|
|
|
|
- DEBUG("ft1000_proc_drvmsg:Command message type = 0x%x\n", msgtype);
|
|
|
|
- switch (msgtype) {
|
|
|
|
- case MEDIA_STATE: {
|
|
|
|
- DEBUG("ft1000_proc_drvmsg:Command message type = MEDIA_STATE");
|
|
|
|
-
|
|
|
|
- pmediamsg = (struct media_msg *)&cmdbuffer[0];
|
|
|
|
- if (info->ProgConStat != 0xFF) {
|
|
|
|
- if (pmediamsg->state) {
|
|
|
|
- DEBUG("Media is up\n");
|
|
|
|
- if (info->mediastate == 0) {
|
|
|
|
- if ( info->NetDevRegDone )
|
|
|
|
- {
|
|
|
|
- //netif_carrier_on(dev->net);//mbelian
|
|
|
|
- netif_wake_queue(dev->net);
|
|
|
|
- }
|
|
|
|
- info->mediastate = 1;
|
|
|
|
- /*do_gettimeofday(&tv);
|
|
|
|
- info->ConTm = tv.tv_sec;*/ //mbelian
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- DEBUG("Media is down\n");
|
|
|
|
- if (info->mediastate == 1) {
|
|
|
|
- info->mediastate = 0;
|
|
|
|
- if ( info->NetDevRegDone )
|
|
|
|
- {
|
|
|
|
- //netif_carrier_off(dev->net); mbelian
|
|
|
|
- //netif_stop_queue(dev->net);
|
|
|
|
- }
|
|
|
|
- info->ConTm = 0;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- DEBUG("Media is down\n");
|
|
|
|
- if (info->mediastate == 1) {
|
|
|
|
- info->mediastate = 0;
|
|
|
|
- if ( info->NetDevRegDone)
|
|
|
|
- {
|
|
|
|
- //netif_carrier_off(dev->net); //mbelian
|
|
|
|
- //netif_stop_queue(dev->net);
|
|
|
|
- }
|
|
|
|
- info->ConTm = 0;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- case DSP_INIT_MSG: {
|
|
|
|
- DEBUG("ft1000_proc_drvmsg:Command message type = DSP_INIT_MSG");
|
|
|
|
-
|
|
|
|
- pdspinitmsg = (struct dsp_init_msg *)&cmdbuffer[2];
|
|
|
|
- memcpy(info->DspVer, pdspinitmsg->DspVer, DSPVERSZ);
|
|
|
|
- DEBUG("DSPVER = 0x%2x 0x%2x 0x%2x 0x%2x\n", info->DspVer[0], info->DspVer[1], info->DspVer[2], info->DspVer[3]);
|
|
|
|
- memcpy(info->HwSerNum, pdspinitmsg->HwSerNum, HWSERNUMSZ);
|
|
|
|
- memcpy(info->Sku, pdspinitmsg->Sku, SKUSZ);
|
|
|
|
- memcpy(info->eui64, pdspinitmsg->eui64, EUISZ);
|
|
|
|
- DEBUG("EUI64=%2x.%2x.%2x.%2x.%2x.%2x.%2x.%2x\n", info->eui64[0],info->eui64[1], info->eui64[2], info->eui64[3], info->eui64[4], info->eui64[5],info->eui64[6], info->eui64[7]);
|
|
|
|
- dev->net->dev_addr[0] = info->eui64[0];
|
|
|
|
- dev->net->dev_addr[1] = info->eui64[1];
|
|
|
|
- dev->net->dev_addr[2] = info->eui64[2];
|
|
|
|
- dev->net->dev_addr[3] = info->eui64[5];
|
|
|
|
- dev->net->dev_addr[4] = info->eui64[6];
|
|
|
|
- dev->net->dev_addr[5] = info->eui64[7];
|
|
|
|
-
|
|
|
|
- if (ntohs(pdspinitmsg->length) == (sizeof(struct dsp_init_msg) - 20)) {
|
|
|
|
- memcpy(info->ProductMode, pdspinitmsg->ProductMode, MODESZ);
|
|
|
|
- memcpy(info->RfCalVer, pdspinitmsg->RfCalVer, CALVERSZ);
|
|
|
|
- memcpy(info->RfCalDate, pdspinitmsg->RfCalDate, CALDATESZ);
|
|
|
|
- DEBUG("RFCalVer = 0x%2x 0x%2x\n", info->RfCalVer[0], info->RfCalVer[1]);
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- case DSP_PROVISION: {
|
|
|
|
- DEBUG("ft1000_proc_drvmsg:Command message type = DSP_PROVISION\n");
|
|
|
|
|
|
+ msgtype = ntohs(pdrvmsg->type);
|
|
|
|
+ DEBUG("ft1000_proc_drvmsg:Command message type = 0x%x\n", msgtype);
|
|
|
|
+ switch (msgtype) {
|
|
|
|
+ case MEDIA_STATE:{
|
|
|
|
+ DEBUG
|
|
|
|
+ ("ft1000_proc_drvmsg:Command message type = MEDIA_STATE");
|
|
|
|
+
|
|
|
|
+ pmediamsg = (struct media_msg *)&cmdbuffer[0];
|
|
|
|
+ if (info->ProgConStat != 0xFF) {
|
|
|
|
+ if (pmediamsg->state) {
|
|
|
|
+ DEBUG("Media is up\n");
|
|
|
|
+ if (info->mediastate == 0) {
|
|
|
|
+ if (info->NetDevRegDone) {
|
|
|
|
+ //netif_carrier_on(dev->net);//mbelian
|
|
|
|
+ netif_wake_queue(dev->
|
|
|
|
+ net);
|
|
|
|
+ }
|
|
|
|
+ info->mediastate = 1;
|
|
|
|
+ /*do_gettimeofday(&tv);
|
|
|
|
+ info->ConTm = tv.tv_sec; *///mbelian
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ DEBUG("Media is down\n");
|
|
|
|
+ if (info->mediastate == 1) {
|
|
|
|
+ info->mediastate = 0;
|
|
|
|
+ if (info->NetDevRegDone) {
|
|
|
|
+ //netif_carrier_off(dev->net); mbelian
|
|
|
|
+ //netif_stop_queue(dev->net);
|
|
|
|
+ }
|
|
|
|
+ info->ConTm = 0;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ DEBUG("Media is down\n");
|
|
|
|
+ if (info->mediastate == 1) {
|
|
|
|
+ info->mediastate = 0;
|
|
|
|
+ if (info->NetDevRegDone) {
|
|
|
|
+ //netif_carrier_off(dev->net); //mbelian
|
|
|
|
+ //netif_stop_queue(dev->net);
|
|
|
|
+ }
|
|
|
|
+ info->ConTm = 0;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ case DSP_INIT_MSG:{
|
|
|
|
+ DEBUG
|
|
|
|
+ ("ft1000_proc_drvmsg:Command message type = DSP_INIT_MSG");
|
|
|
|
+
|
|
|
|
+ pdspinitmsg = (struct dsp_init_msg *)&cmdbuffer[2];
|
|
|
|
+ memcpy(info->DspVer, pdspinitmsg->DspVer, DSPVERSZ);
|
|
|
|
+ DEBUG("DSPVER = 0x%2x 0x%2x 0x%2x 0x%2x\n",
|
|
|
|
+ info->DspVer[0], info->DspVer[1], info->DspVer[2],
|
|
|
|
+ info->DspVer[3]);
|
|
|
|
+ memcpy(info->HwSerNum, pdspinitmsg->HwSerNum,
|
|
|
|
+ HWSERNUMSZ);
|
|
|
|
+ memcpy(info->Sku, pdspinitmsg->Sku, SKUSZ);
|
|
|
|
+ memcpy(info->eui64, pdspinitmsg->eui64, EUISZ);
|
|
|
|
+ DEBUG("EUI64=%2x.%2x.%2x.%2x.%2x.%2x.%2x.%2x\n",
|
|
|
|
+ info->eui64[0], info->eui64[1], info->eui64[2],
|
|
|
|
+ info->eui64[3], info->eui64[4], info->eui64[5],
|
|
|
|
+ info->eui64[6], info->eui64[7]);
|
|
|
|
+ dev->net->dev_addr[0] = info->eui64[0];
|
|
|
|
+ dev->net->dev_addr[1] = info->eui64[1];
|
|
|
|
+ dev->net->dev_addr[2] = info->eui64[2];
|
|
|
|
+ dev->net->dev_addr[3] = info->eui64[5];
|
|
|
|
+ dev->net->dev_addr[4] = info->eui64[6];
|
|
|
|
+ dev->net->dev_addr[5] = info->eui64[7];
|
|
|
|
+
|
|
|
|
+ if (ntohs(pdspinitmsg->length) ==
|
|
|
|
+ (sizeof(struct dsp_init_msg) - 20)) {
|
|
|
|
+ memcpy(info->ProductMode,
|
|
|
|
+ pdspinitmsg->ProductMode, MODESZ);
|
|
|
|
+ memcpy(info->RfCalVer, pdspinitmsg->RfCalVer,
|
|
|
|
+ CALVERSZ);
|
|
|
|
+ memcpy(info->RfCalDate, pdspinitmsg->RfCalDate,
|
|
|
|
+ CALDATESZ);
|
|
|
|
+ DEBUG("RFCalVer = 0x%2x 0x%2x\n",
|
|
|
|
+ info->RfCalVer[0], info->RfCalVer[1]);
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ case DSP_PROVISION:{
|
|
|
|
+ DEBUG
|
|
|
|
+ ("ft1000_proc_drvmsg:Command message type = DSP_PROVISION\n");
|
|
|
|
+
|
|
|
|
+ /* kick off dspprov routine to start provisioning
|
|
|
|
+ * Send provisioning data to DSP
|
|
|
|
+ */
|
|
|
|
+ if (list_empty(&info->prov_list) == 0) {
|
|
|
|
+ info->fProvComplete = 0;
|
|
|
|
+ status = ft1000_dsp_prov(dev);
|
|
|
|
+ if (status != STATUS_SUCCESS)
|
|
|
|
+ goto out;
|
|
|
|
+ } else {
|
|
|
|
+ info->fProvComplete = 1;
|
|
|
|
+ status =
|
|
|
|
+ ft1000_write_register(dev, FT1000_DB_HB,
|
|
|
|
+ FT1000_REG_DOORBELL);
|
|
|
|
+ DEBUG
|
|
|
|
+ ("FT1000:drivermsg:No more DSP provisioning data in dsp image\n");
|
|
|
|
+ }
|
|
|
|
+ DEBUG("ft1000_proc_drvmsg:DSP PROVISION is done\n");
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ case DSP_STORE_INFO:{
|
|
|
|
+ DEBUG
|
|
|
|
+ ("ft1000_proc_drvmsg:Command message type = DSP_STORE_INFO");
|
|
|
|
+
|
|
|
|
+ DEBUG("FT1000:drivermsg:Got DSP_STORE_INFO\n");
|
|
|
|
+ tempword = ntohs(pdrvmsg->length);
|
|
|
|
+ info->DSPInfoBlklen = tempword;
|
|
|
|
+ if (tempword < (MAX_DSP_SESS_REC - 4)) {
|
|
|
|
+ pmsg = (u16 *) &pdrvmsg->data[0];
|
|
|
|
+ for (i = 0; i < ((tempword + 1) / 2); i++) {
|
|
|
|
+ DEBUG
|
|
|
|
+ ("FT1000:drivermsg:dsp info data = 0x%x\n",
|
|
|
|
+ *pmsg);
|
|
|
|
+ info->DSPInfoBlk[i + 10] = *pmsg++;
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ info->DSPInfoBlklen = 0;
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ case DSP_GET_INFO:{
|
|
|
|
+ DEBUG("FT1000:drivermsg:Got DSP_GET_INFO\n");
|
|
|
|
+ /* copy dsp info block to dsp */
|
|
|
|
+ info->DrvMsgPend = 1;
|
|
|
|
+ /* allow any outstanding ioctl to finish */
|
|
|
|
+ mdelay(10);
|
|
|
|
+ status =
|
|
|
|
+ ft1000_read_register(dev, &tempword,
|
|
|
|
+ FT1000_REG_DOORBELL);
|
|
|
|
+ if (tempword & FT1000_DB_DPRAM_TX) {
|
|
|
|
+ mdelay(10);
|
|
|
|
+ status =
|
|
|
|
+ ft1000_read_register(dev, &tempword,
|
|
|
|
+ FT1000_REG_DOORBELL);
|
|
|
|
+ if (tempword & FT1000_DB_DPRAM_TX) {
|
|
|
|
+ mdelay(10);
|
|
|
|
+ status =
|
|
|
|
+ ft1000_read_register(dev, &tempword,
|
|
|
|
+ FT1000_REG_DOORBELL);
|
|
|
|
+ if (tempword & FT1000_DB_DPRAM_TX)
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ /* Put message into Slow Queue
|
|
|
|
+ * Form Pseudo header
|
|
|
|
+ */
|
|
|
|
+ pmsg = (u16 *) info->DSPInfoBlk;
|
|
|
|
+ *pmsg++ = 0;
|
|
|
|
+ *pmsg++ =
|
|
|
|
+ htons(info->DSPInfoBlklen + 20 +
|
|
|
|
+ info->DSPInfoBlklen);
|
|
|
|
+ ppseudo_hdr =
|
|
|
|
+ (struct pseudo_hdr *)(u16 *) &info->DSPInfoBlk[2];
|
|
|
|
+ ppseudo_hdr->length =
|
|
|
|
+ htons(info->DSPInfoBlklen + 4 +
|
|
|
|
+ info->DSPInfoBlklen);
|
|
|
|
+ ppseudo_hdr->source = 0x10;
|
|
|
|
+ ppseudo_hdr->destination = 0x20;
|
|
|
|
+ ppseudo_hdr->portdest = 0;
|
|
|
|
+ ppseudo_hdr->portsrc = 0;
|
|
|
|
+ ppseudo_hdr->sh_str_id = 0;
|
|
|
|
+ ppseudo_hdr->control = 0;
|
|
|
|
+ ppseudo_hdr->rsvd1 = 0;
|
|
|
|
+ ppseudo_hdr->rsvd2 = 0;
|
|
|
|
+ ppseudo_hdr->qos_class = 0;
|
|
|
|
+ /* Insert slow queue sequence number */
|
|
|
|
+ ppseudo_hdr->seq_num = info->squeseqnum++;
|
|
|
|
+ /* Insert application id */
|
|
|
|
+ ppseudo_hdr->portsrc = 0;
|
|
|
|
+ /* Calculate new checksum */
|
|
|
|
+ ppseudo_hdr->checksum = *pmsg++;
|
|
|
|
+ for (i = 1; i < 7; i++)
|
|
|
|
+ ppseudo_hdr->checksum ^= *pmsg++;
|
|
|
|
|
|
- // kick off dspprov routine to start provisioning
|
|
|
|
- // Send provisioning data to DSP
|
|
|
|
- if (list_empty(&info->prov_list) == 0)
|
|
|
|
- {
|
|
|
|
- info->fProvComplete = 0;
|
|
|
|
- status = ft1000_dsp_prov(dev);
|
|
|
|
- if (status != STATUS_SUCCESS)
|
|
|
|
- goto out;
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- info->fProvComplete = 1;
|
|
|
|
- status = ft1000_write_register (dev, FT1000_DB_HB, FT1000_REG_DOORBELL);
|
|
|
|
- DEBUG("FT1000:drivermsg:No more DSP provisioning data in dsp image\n");
|
|
|
|
- }
|
|
|
|
- DEBUG("ft1000_proc_drvmsg:DSP PROVISION is done\n");
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- case DSP_STORE_INFO: {
|
|
|
|
- DEBUG("ft1000_proc_drvmsg:Command message type = DSP_STORE_INFO");
|
|
|
|
-
|
|
|
|
- DEBUG("FT1000:drivermsg:Got DSP_STORE_INFO\n");
|
|
|
|
- tempword = ntohs(pdrvmsg->length);
|
|
|
|
- info->DSPInfoBlklen = tempword;
|
|
|
|
- if (tempword < (MAX_DSP_SESS_REC-4) ) {
|
|
|
|
- pmsg = (u16 *)&pdrvmsg->data[0];
|
|
|
|
- for (i=0; i<((tempword+1)/2); i++) {
|
|
|
|
- DEBUG("FT1000:drivermsg:dsp info data = 0x%x\n", *pmsg);
|
|
|
|
- info->DSPInfoBlk[i+10] = *pmsg++;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- info->DSPInfoBlklen = 0;
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- case DSP_GET_INFO: {
|
|
|
|
- DEBUG("FT1000:drivermsg:Got DSP_GET_INFO\n");
|
|
|
|
- // copy dsp info block to dsp
|
|
|
|
- info->DrvMsgPend = 1;
|
|
|
|
- // allow any outstanding ioctl to finish
|
|
|
|
- mdelay(10);
|
|
|
|
- status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL);
|
|
|
|
- if (tempword & FT1000_DB_DPRAM_TX) {
|
|
|
|
- mdelay(10);
|
|
|
|
- status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL);
|
|
|
|
- if (tempword & FT1000_DB_DPRAM_TX) {
|
|
|
|
- mdelay(10);
|
|
|
|
- status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL);
|
|
|
|
- if (tempword & FT1000_DB_DPRAM_TX) {
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- // Put message into Slow Queue
|
|
|
|
- // Form Pseudo header
|
|
|
|
- pmsg = (u16 *)info->DSPInfoBlk;
|
|
|
|
- *pmsg++ = 0;
|
|
|
|
- *pmsg++ = htons(info->DSPInfoBlklen+20+info->DSPInfoBlklen);
|
|
|
|
- ppseudo_hdr = (struct pseudo_hdr *)(u16 *)&info->DSPInfoBlk[2];
|
|
|
|
- ppseudo_hdr->length = htons(info->DSPInfoBlklen+4+info->DSPInfoBlklen);
|
|
|
|
- ppseudo_hdr->source = 0x10;
|
|
|
|
- ppseudo_hdr->destination = 0x20;
|
|
|
|
- ppseudo_hdr->portdest = 0;
|
|
|
|
- ppseudo_hdr->portsrc = 0;
|
|
|
|
- ppseudo_hdr->sh_str_id = 0;
|
|
|
|
- ppseudo_hdr->control = 0;
|
|
|
|
- ppseudo_hdr->rsvd1 = 0;
|
|
|
|
- ppseudo_hdr->rsvd2 = 0;
|
|
|
|
- ppseudo_hdr->qos_class = 0;
|
|
|
|
- // Insert slow queue sequence number
|
|
|
|
- ppseudo_hdr->seq_num = info->squeseqnum++;
|
|
|
|
- // Insert application id
|
|
|
|
- ppseudo_hdr->portsrc = 0;
|
|
|
|
- // Calculate new checksum
|
|
|
|
- ppseudo_hdr->checksum = *pmsg++;
|
|
|
|
- for (i=1; i<7; i++) {
|
|
|
|
- ppseudo_hdr->checksum ^= *pmsg++;
|
|
|
|
- }
|
|
|
|
- info->DSPInfoBlk[10] = 0x7200;
|
|
|
|
- info->DSPInfoBlk[11] = htons(info->DSPInfoBlklen);
|
|
|
|
- status = ft1000_write_dpram32 (dev, 0, (u8 *)&info->DSPInfoBlk[0], (unsigned short)(info->DSPInfoBlklen+22));
|
|
|
|
- status = ft1000_write_register (dev, FT1000_DB_DPRAM_TX, FT1000_REG_DOORBELL);
|
|
|
|
- info->DrvMsgPend = 0;
|
|
|
|
-
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
|
|
+ info->DSPInfoBlk[10] = 0x7200;
|
|
|
|
+ info->DSPInfoBlk[11] = htons(info->DSPInfoBlklen);
|
|
|
|
+ status =
|
|
|
|
+ ft1000_write_dpram32(dev, 0,
|
|
|
|
+ (u8 *) &info->DSPInfoBlk[0],
|
|
|
|
+ (unsigned short)(info->
|
|
|
|
+ DSPInfoBlklen
|
|
|
|
+ + 22));
|
|
|
|
+ status =
|
|
|
|
+ ft1000_write_register(dev, FT1000_DB_DPRAM_TX,
|
|
|
|
+ FT1000_REG_DOORBELL);
|
|
|
|
+ info->DrvMsgPend = 0;
|
|
|
|
|
|
- case GET_DRV_ERR_RPT_MSG: {
|
|
|
|
- DEBUG("FT1000:drivermsg:Got GET_DRV_ERR_RPT_MSG\n");
|
|
|
|
- // copy driver error message to dsp
|
|
|
|
- info->DrvMsgPend = 1;
|
|
|
|
- // allow any outstanding ioctl to finish
|
|
|
|
- mdelay(10);
|
|
|
|
- status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL);
|
|
|
|
- if (tempword & FT1000_DB_DPRAM_TX) {
|
|
|
|
- mdelay(10);
|
|
|
|
- status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL);
|
|
|
|
- if (tempword & FT1000_DB_DPRAM_TX) {
|
|
|
|
- mdelay(10);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if ( (tempword & FT1000_DB_DPRAM_TX) == 0) {
|
|
|
|
- // Put message into Slow Queue
|
|
|
|
- // Form Pseudo header
|
|
|
|
- pmsg = (u16 *)&tempbuffer[0];
|
|
|
|
- ppseudo_hdr = (struct pseudo_hdr *)pmsg;
|
|
|
|
- ppseudo_hdr->length = htons(0x0012);
|
|
|
|
- ppseudo_hdr->source = 0x10;
|
|
|
|
- ppseudo_hdr->destination = 0x20;
|
|
|
|
- ppseudo_hdr->portdest = 0;
|
|
|
|
- ppseudo_hdr->portsrc = 0;
|
|
|
|
- ppseudo_hdr->sh_str_id = 0;
|
|
|
|
- ppseudo_hdr->control = 0;
|
|
|
|
- ppseudo_hdr->rsvd1 = 0;
|
|
|
|
- ppseudo_hdr->rsvd2 = 0;
|
|
|
|
- ppseudo_hdr->qos_class = 0;
|
|
|
|
- // Insert slow queue sequence number
|
|
|
|
- ppseudo_hdr->seq_num = info->squeseqnum++;
|
|
|
|
- // Insert application id
|
|
|
|
- ppseudo_hdr->portsrc = 0;
|
|
|
|
- // Calculate new checksum
|
|
|
|
- ppseudo_hdr->checksum = *pmsg++;
|
|
|
|
- for (i=1; i<7; i++) {
|
|
|
|
- ppseudo_hdr->checksum ^= *pmsg++;
|
|
|
|
- }
|
|
|
|
- pmsg = (u16 *)&tempbuffer[16];
|
|
|
|
- *pmsg++ = htons(RSP_DRV_ERR_RPT_MSG);
|
|
|
|
- *pmsg++ = htons(0x000e);
|
|
|
|
- *pmsg++ = htons(info->DSP_TIME[0]);
|
|
|
|
- *pmsg++ = htons(info->DSP_TIME[1]);
|
|
|
|
- *pmsg++ = htons(info->DSP_TIME[2]);
|
|
|
|
- *pmsg++ = htons(info->DSP_TIME[3]);
|
|
|
|
- convert.byte[0] = info->DspVer[0];
|
|
|
|
- convert.byte[1] = info->DspVer[1];
|
|
|
|
- *pmsg++ = convert.wrd;
|
|
|
|
- convert.byte[0] = info->DspVer[2];
|
|
|
|
- convert.byte[1] = info->DspVer[3];
|
|
|
|
- *pmsg++ = convert.wrd;
|
|
|
|
- *pmsg++ = htons(info->DrvErrNum);
|
|
|
|
-
|
|
|
|
- card_send_command (dev, (unsigned char*)&tempbuffer[0], (u16)(0x0012 + PSEUDOSZ));
|
|
|
|
- info->DrvErrNum = 0;
|
|
|
|
- }
|
|
|
|
- info->DrvMsgPend = 0;
|
|
|
|
-
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- default:
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ case GET_DRV_ERR_RPT_MSG:{
|
|
|
|
+ DEBUG("FT1000:drivermsg:Got GET_DRV_ERR_RPT_MSG\n");
|
|
|
|
+ /* copy driver error message to dsp */
|
|
|
|
+ info->DrvMsgPend = 1;
|
|
|
|
+ /* allow any outstanding ioctl to finish */
|
|
|
|
+ mdelay(10);
|
|
|
|
+ status =
|
|
|
|
+ ft1000_read_register(dev, &tempword,
|
|
|
|
+ FT1000_REG_DOORBELL);
|
|
|
|
+ if (tempword & FT1000_DB_DPRAM_TX) {
|
|
|
|
+ mdelay(10);
|
|
|
|
+ status =
|
|
|
|
+ ft1000_read_register(dev, &tempword,
|
|
|
|
+ FT1000_REG_DOORBELL);
|
|
|
|
+ if (tempword & FT1000_DB_DPRAM_TX)
|
|
|
|
+ mdelay(10);
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ if ((tempword & FT1000_DB_DPRAM_TX) == 0) {
|
|
|
|
+ /* Put message into Slow Queue
|
|
|
|
+ * Form Pseudo header
|
|
|
|
+ */
|
|
|
|
+ pmsg = (u16 *) &tempbuffer[0];
|
|
|
|
+ ppseudo_hdr = (struct pseudo_hdr *)pmsg;
|
|
|
|
+ ppseudo_hdr->length = htons(0x0012);
|
|
|
|
+ ppseudo_hdr->source = 0x10;
|
|
|
|
+ ppseudo_hdr->destination = 0x20;
|
|
|
|
+ ppseudo_hdr->portdest = 0;
|
|
|
|
+ ppseudo_hdr->portsrc = 0;
|
|
|
|
+ ppseudo_hdr->sh_str_id = 0;
|
|
|
|
+ ppseudo_hdr->control = 0;
|
|
|
|
+ ppseudo_hdr->rsvd1 = 0;
|
|
|
|
+ ppseudo_hdr->rsvd2 = 0;
|
|
|
|
+ ppseudo_hdr->qos_class = 0;
|
|
|
|
+ /* Insert slow queue sequence number */
|
|
|
|
+ ppseudo_hdr->seq_num = info->squeseqnum++;
|
|
|
|
+ /* Insert application id */
|
|
|
|
+ ppseudo_hdr->portsrc = 0;
|
|
|
|
+ /* Calculate new checksum */
|
|
|
|
+ ppseudo_hdr->checksum = *pmsg++;
|
|
|
|
+ for (i = 1; i < 7; i++)
|
|
|
|
+ ppseudo_hdr->checksum ^= *pmsg++;
|
|
|
|
+
|
|
|
|
+ pmsg = (u16 *) &tempbuffer[16];
|
|
|
|
+ *pmsg++ = htons(RSP_DRV_ERR_RPT_MSG);
|
|
|
|
+ *pmsg++ = htons(0x000e);
|
|
|
|
+ *pmsg++ = htons(info->DSP_TIME[0]);
|
|
|
|
+ *pmsg++ = htons(info->DSP_TIME[1]);
|
|
|
|
+ *pmsg++ = htons(info->DSP_TIME[2]);
|
|
|
|
+ *pmsg++ = htons(info->DSP_TIME[3]);
|
|
|
|
+ convert.byte[0] = info->DspVer[0];
|
|
|
|
+ convert.byte[1] = info->DspVer[1];
|
|
|
|
+ *pmsg++ = convert.wrd;
|
|
|
|
+ convert.byte[0] = info->DspVer[2];
|
|
|
|
+ convert.byte[1] = info->DspVer[3];
|
|
|
|
+ *pmsg++ = convert.wrd;
|
|
|
|
+ *pmsg++ = htons(info->DrvErrNum);
|
|
|
|
+
|
|
|
|
+ card_send_command(dev,
|
|
|
|
+ (unsigned char *)&tempbuffer[0],
|
|
|
|
+ (u16) (0x0012 + PSEUDOSZ));
|
|
|
|
+ info->DrvErrNum = 0;
|
|
|
|
+ }
|
|
|
|
+ info->DrvMsgPend = 0;
|
|
|
|
|
|
- status = STATUS_SUCCESS;
|
|
|
|
-out:
|
|
|
|
- kfree(cmdbuffer);
|
|
|
|
- DEBUG("return from ft1000_proc_drvmsg\n");
|
|
|
|
- return status;
|
|
|
|
-}
|
|
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ default:
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ status = STATUS_SUCCESS;
|
|
|
|
+out:
|
|
|
|
+ kfree(cmdbuffer);
|
|
|
|
+ DEBUG("return from ft1000_proc_drvmsg\n");
|
|
|
|
+ return status;
|
|
|
|
+}
|
|
|
|
|
|
int ft1000_poll(void* dev_id) {
|
|
int ft1000_poll(void* dev_id) {
|
|
|
|
|