diff options
author | Marek Belisko <marek.belisko@open-nandra.com> | 2011-03-10 05:51:35 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-03-14 14:51:21 -0400 |
commit | 6d2b67219523afbb7d83e8664cb9b0f4f267bd9a (patch) | |
tree | aaa5a8c49fe270991e0c69baa20dce9e0af01b20 /drivers/staging/ft1000 | |
parent | fc796a6502de4c146bf3893390cca43df2d0e539 (diff) |
staging: ft1000: Fix coding style in ft1000_proc_drvmsg function.
Signed-off-by: Marek Belisko <marek.belisko@open-nandra.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/ft1000')
-rw-r--r-- | drivers/staging/ft1000/ft1000-usb/ft1000_hw.c | 558 |
1 files changed, 295 insertions, 263 deletions
diff --git a/drivers/staging/ft1000/ft1000-usb/ft1000_hw.c b/drivers/staging/ft1000/ft1000-usb/ft1000_hw.c index 01877581a57..78dcd49bb98 100644 --- a/drivers/staging/ft1000/ft1000-usb/ft1000_hw.c +++ b/drivers/staging/ft1000/ft1000-usb/ft1000_hw.c | |||
@@ -1530,286 +1530,318 @@ static int ft1000_dsp_prov(void *arg) | |||
1530 | return STATUS_SUCCESS; | 1530 | return STATUS_SUCCESS; |
1531 | } | 1531 | } |
1532 | 1532 | ||
1533 | static int ft1000_proc_drvmsg (struct ft1000_device *dev, u16 size) { | 1533 | static int ft1000_proc_drvmsg(struct ft1000_device *dev, u16 size) |
1534 | { | ||
1534 | struct ft1000_info *info = netdev_priv(dev->net); | 1535 | struct ft1000_info *info = netdev_priv(dev->net); |
1535 | u16 msgtype; | 1536 | u16 msgtype; |
1536 | u16 tempword; | 1537 | u16 tempword; |
1537 | struct media_msg *pmediamsg; | 1538 | struct media_msg *pmediamsg; |
1538 | struct dsp_init_msg *pdspinitmsg; | 1539 | struct dsp_init_msg *pdspinitmsg; |
1539 | struct drv_msg *pdrvmsg; | 1540 | struct drv_msg *pdrvmsg; |
1540 | u16 i; | 1541 | u16 i; |
1541 | struct pseudo_hdr *ppseudo_hdr; | 1542 | struct pseudo_hdr *ppseudo_hdr; |
1542 | u16 *pmsg; | 1543 | u16 *pmsg; |
1543 | u16 status; | 1544 | u16 status; |
1544 | union { | 1545 | union { |
1545 | u8 byte[2]; | 1546 | u8 byte[2]; |
1546 | u16 wrd; | 1547 | u16 wrd; |
1547 | } convert; | 1548 | } convert; |
1548 | |||
1549 | |||
1550 | char *cmdbuffer = kmalloc(1600, GFP_KERNEL); | ||
1551 | if (!cmdbuffer) | ||
1552 | return STATUS_FAILURE; | ||
1553 | |||
1554 | status = ft1000_read_dpram32(dev, 0x200, cmdbuffer, size); | ||
1555 | 1549 | ||
1550 | char *cmdbuffer = kmalloc(1600, GFP_KERNEL); | ||
1551 | if (!cmdbuffer) | ||
1552 | return STATUS_FAILURE; | ||
1556 | 1553 | ||
1554 | status = ft1000_read_dpram32(dev, 0x200, cmdbuffer, size); | ||
1557 | 1555 | ||
1558 | #ifdef JDEBUG | 1556 | #ifdef JDEBUG |
1559 | DEBUG("ft1000_proc_drvmsg:cmdbuffer\n"); | 1557 | DEBUG("ft1000_proc_drvmsg:cmdbuffer\n"); |
1560 | for(i = 0; i < size; i+=5) | 1558 | for (i = 0; i < size; i += 5) { |
1561 | { | 1559 | if ((i + 5) < size) |
1562 | if( (i + 5) < size ) | 1560 | DEBUG("0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", cmdbuffer[i], |
1563 | 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]); | 1561 | cmdbuffer[i + 1], cmdbuffer[i + 2], |
1564 | else | 1562 | cmdbuffer[i + 3], cmdbuffer[i + 4]); |
1565 | { | 1563 | else { |
1566 | for (j = i; j < size; j++) | 1564 | for (j = i; j < size; j++) |
1567 | DEBUG("0x%x ", cmdbuffer[j]); | 1565 | DEBUG("0x%x ", cmdbuffer[j]); |
1568 | DEBUG("\n"); | 1566 | DEBUG("\n"); |
1569 | break; | 1567 | break; |
1570 | } | 1568 | } |
1571 | } | 1569 | } |
1572 | #endif | 1570 | #endif |
1573 | pdrvmsg = (struct drv_msg *)&cmdbuffer[2]; | 1571 | pdrvmsg = (struct drv_msg *)&cmdbuffer[2]; |
1574 | msgtype = ntohs(pdrvmsg->type); | 1572 | msgtype = ntohs(pdrvmsg->type); |
1575 | DEBUG("ft1000_proc_drvmsg:Command message type = 0x%x\n", msgtype); | 1573 | DEBUG("ft1000_proc_drvmsg:Command message type = 0x%x\n", msgtype); |
1576 | switch (msgtype) { | 1574 | switch (msgtype) { |
1577 | case MEDIA_STATE: { | 1575 | case MEDIA_STATE:{ |
1578 | DEBUG("ft1000_proc_drvmsg:Command message type = MEDIA_STATE"); | 1576 | DEBUG |
1579 | 1577 | ("ft1000_proc_drvmsg:Command message type = MEDIA_STATE"); | |
1580 | pmediamsg = (struct media_msg *)&cmdbuffer[0]; | 1578 | |
1581 | if (info->ProgConStat != 0xFF) { | 1579 | pmediamsg = (struct media_msg *)&cmdbuffer[0]; |
1582 | if (pmediamsg->state) { | 1580 | if (info->ProgConStat != 0xFF) { |
1583 | DEBUG("Media is up\n"); | 1581 | if (pmediamsg->state) { |
1584 | if (info->mediastate == 0) { | 1582 | DEBUG("Media is up\n"); |
1585 | if ( info->NetDevRegDone ) | 1583 | if (info->mediastate == 0) { |
1586 | { | 1584 | if (info->NetDevRegDone) { |
1587 | //netif_carrier_on(dev->net);//mbelian | 1585 | //netif_carrier_on(dev->net);//mbelian |
1588 | netif_wake_queue(dev->net); | 1586 | netif_wake_queue(dev-> |
1589 | } | 1587 | net); |
1590 | info->mediastate = 1; | 1588 | } |
1591 | /*do_gettimeofday(&tv); | 1589 | info->mediastate = 1; |
1592 | info->ConTm = tv.tv_sec;*/ //mbelian | 1590 | /*do_gettimeofday(&tv); |
1593 | } | 1591 | info->ConTm = tv.tv_sec; *///mbelian |
1594 | } | 1592 | } |
1595 | else { | 1593 | } else { |
1596 | DEBUG("Media is down\n"); | 1594 | DEBUG("Media is down\n"); |
1597 | if (info->mediastate == 1) { | 1595 | if (info->mediastate == 1) { |
1598 | info->mediastate = 0; | 1596 | info->mediastate = 0; |
1599 | if ( info->NetDevRegDone ) | 1597 | if (info->NetDevRegDone) { |
1600 | { | 1598 | //netif_carrier_off(dev->net); mbelian |
1601 | //netif_carrier_off(dev->net); mbelian | 1599 | //netif_stop_queue(dev->net); |
1602 | //netif_stop_queue(dev->net); | 1600 | } |
1603 | } | 1601 | info->ConTm = 0; |
1604 | info->ConTm = 0; | 1602 | } |
1605 | } | 1603 | } |
1606 | } | 1604 | } else { |
1607 | } | 1605 | DEBUG("Media is down\n"); |
1608 | else { | 1606 | if (info->mediastate == 1) { |
1609 | DEBUG("Media is down\n"); | 1607 | info->mediastate = 0; |
1610 | if (info->mediastate == 1) { | 1608 | if (info->NetDevRegDone) { |
1611 | info->mediastate = 0; | 1609 | //netif_carrier_off(dev->net); //mbelian |
1612 | if ( info->NetDevRegDone) | 1610 | //netif_stop_queue(dev->net); |
1613 | { | 1611 | } |
1614 | //netif_carrier_off(dev->net); //mbelian | 1612 | info->ConTm = 0; |
1615 | //netif_stop_queue(dev->net); | 1613 | } |
1616 | } | 1614 | } |
1617 | info->ConTm = 0; | 1615 | break; |
1618 | } | 1616 | } |
1619 | } | 1617 | case DSP_INIT_MSG:{ |
1620 | break; | 1618 | DEBUG |
1621 | } | 1619 | ("ft1000_proc_drvmsg:Command message type = DSP_INIT_MSG"); |
1622 | case DSP_INIT_MSG: { | 1620 | |
1623 | DEBUG("ft1000_proc_drvmsg:Command message type = DSP_INIT_MSG"); | 1621 | pdspinitmsg = (struct dsp_init_msg *)&cmdbuffer[2]; |
1624 | 1622 | memcpy(info->DspVer, pdspinitmsg->DspVer, DSPVERSZ); | |
1625 | pdspinitmsg = (struct dsp_init_msg *)&cmdbuffer[2]; | 1623 | DEBUG("DSPVER = 0x%2x 0x%2x 0x%2x 0x%2x\n", |
1626 | memcpy(info->DspVer, pdspinitmsg->DspVer, DSPVERSZ); | 1624 | info->DspVer[0], info->DspVer[1], info->DspVer[2], |
1627 | DEBUG("DSPVER = 0x%2x 0x%2x 0x%2x 0x%2x\n", info->DspVer[0], info->DspVer[1], info->DspVer[2], info->DspVer[3]); | 1625 | info->DspVer[3]); |
1628 | memcpy(info->HwSerNum, pdspinitmsg->HwSerNum, HWSERNUMSZ); | 1626 | memcpy(info->HwSerNum, pdspinitmsg->HwSerNum, |
1629 | memcpy(info->Sku, pdspinitmsg->Sku, SKUSZ); | 1627 | HWSERNUMSZ); |
1630 | memcpy(info->eui64, pdspinitmsg->eui64, EUISZ); | 1628 | memcpy(info->Sku, pdspinitmsg->Sku, SKUSZ); |
1631 | 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]); | 1629 | memcpy(info->eui64, pdspinitmsg->eui64, EUISZ); |
1632 | dev->net->dev_addr[0] = info->eui64[0]; | 1630 | DEBUG("EUI64=%2x.%2x.%2x.%2x.%2x.%2x.%2x.%2x\n", |
1633 | dev->net->dev_addr[1] = info->eui64[1]; | 1631 | info->eui64[0], info->eui64[1], info->eui64[2], |
1634 | dev->net->dev_addr[2] = info->eui64[2]; | 1632 | info->eui64[3], info->eui64[4], info->eui64[5], |
1635 | dev->net->dev_addr[3] = info->eui64[5]; | 1633 | info->eui64[6], info->eui64[7]); |
1636 | dev->net->dev_addr[4] = info->eui64[6]; | 1634 | dev->net->dev_addr[0] = info->eui64[0]; |
1637 | dev->net->dev_addr[5] = info->eui64[7]; | 1635 | dev->net->dev_addr[1] = info->eui64[1]; |
1638 | 1636 | dev->net->dev_addr[2] = info->eui64[2]; | |
1639 | if (ntohs(pdspinitmsg->length) == (sizeof(struct dsp_init_msg) - 20)) { | 1637 | dev->net->dev_addr[3] = info->eui64[5]; |
1640 | memcpy(info->ProductMode, pdspinitmsg->ProductMode, MODESZ); | 1638 | dev->net->dev_addr[4] = info->eui64[6]; |
1641 | memcpy(info->RfCalVer, pdspinitmsg->RfCalVer, CALVERSZ); | 1639 | dev->net->dev_addr[5] = info->eui64[7]; |
1642 | memcpy(info->RfCalDate, pdspinitmsg->RfCalDate, CALDATESZ); | 1640 | |
1643 | DEBUG("RFCalVer = 0x%2x 0x%2x\n", info->RfCalVer[0], info->RfCalVer[1]); | 1641 | if (ntohs(pdspinitmsg->length) == |
1644 | } | 1642 | (sizeof(struct dsp_init_msg) - 20)) { |
1645 | break; | 1643 | memcpy(info->ProductMode, |
1646 | } | 1644 | pdspinitmsg->ProductMode, MODESZ); |
1647 | case DSP_PROVISION: { | 1645 | memcpy(info->RfCalVer, pdspinitmsg->RfCalVer, |
1648 | DEBUG("ft1000_proc_drvmsg:Command message type = DSP_PROVISION\n"); | 1646 | CALVERSZ); |
1647 | memcpy(info->RfCalDate, pdspinitmsg->RfCalDate, | ||
1648 | CALDATESZ); | ||
1649 | DEBUG("RFCalVer = 0x%2x 0x%2x\n", | ||
1650 | info->RfCalVer[0], info->RfCalVer[1]); | ||
1651 | } | ||
1652 | break; | ||
1653 | } | ||
1654 | case DSP_PROVISION:{ | ||
1655 | DEBUG | ||
1656 | ("ft1000_proc_drvmsg:Command message type = DSP_PROVISION\n"); | ||
1657 | |||
1658 | /* kick off dspprov routine to start provisioning | ||
1659 | * Send provisioning data to DSP | ||
1660 | */ | ||
1661 | if (list_empty(&info->prov_list) == 0) { | ||
1662 | info->fProvComplete = 0; | ||
1663 | status = ft1000_dsp_prov(dev); | ||
1664 | if (status != STATUS_SUCCESS) | ||
1665 | goto out; | ||
1666 | } else { | ||
1667 | info->fProvComplete = 1; | ||
1668 | status = | ||
1669 | ft1000_write_register(dev, FT1000_DB_HB, | ||
1670 | FT1000_REG_DOORBELL); | ||
1671 | DEBUG | ||
1672 | ("FT1000:drivermsg:No more DSP provisioning data in dsp image\n"); | ||
1673 | } | ||
1674 | DEBUG("ft1000_proc_drvmsg:DSP PROVISION is done\n"); | ||
1675 | break; | ||
1676 | } | ||
1677 | case DSP_STORE_INFO:{ | ||
1678 | DEBUG | ||
1679 | ("ft1000_proc_drvmsg:Command message type = DSP_STORE_INFO"); | ||
1680 | |||
1681 | DEBUG("FT1000:drivermsg:Got DSP_STORE_INFO\n"); | ||
1682 | tempword = ntohs(pdrvmsg->length); | ||
1683 | info->DSPInfoBlklen = tempword; | ||
1684 | if (tempword < (MAX_DSP_SESS_REC - 4)) { | ||
1685 | pmsg = (u16 *) &pdrvmsg->data[0]; | ||
1686 | for (i = 0; i < ((tempword + 1) / 2); i++) { | ||
1687 | DEBUG | ||
1688 | ("FT1000:drivermsg:dsp info data = 0x%x\n", | ||
1689 | *pmsg); | ||
1690 | info->DSPInfoBlk[i + 10] = *pmsg++; | ||
1691 | } | ||
1692 | } else { | ||
1693 | info->DSPInfoBlklen = 0; | ||
1694 | } | ||
1695 | break; | ||
1696 | } | ||
1697 | case DSP_GET_INFO:{ | ||
1698 | DEBUG("FT1000:drivermsg:Got DSP_GET_INFO\n"); | ||
1699 | /* copy dsp info block to dsp */ | ||
1700 | info->DrvMsgPend = 1; | ||
1701 | /* allow any outstanding ioctl to finish */ | ||
1702 | mdelay(10); | ||
1703 | status = | ||
1704 | ft1000_read_register(dev, &tempword, | ||
1705 | FT1000_REG_DOORBELL); | ||
1706 | if (tempword & FT1000_DB_DPRAM_TX) { | ||
1707 | mdelay(10); | ||
1708 | status = | ||
1709 | ft1000_read_register(dev, &tempword, | ||
1710 | FT1000_REG_DOORBELL); | ||
1711 | if (tempword & FT1000_DB_DPRAM_TX) { | ||
1712 | mdelay(10); | ||
1713 | status = | ||
1714 | ft1000_read_register(dev, &tempword, | ||
1715 | FT1000_REG_DOORBELL); | ||
1716 | if (tempword & FT1000_DB_DPRAM_TX) | ||
1717 | break; | ||
1718 | } | ||
1719 | } | ||
1720 | /* Put message into Slow Queue | ||
1721 | * Form Pseudo header | ||
1722 | */ | ||
1723 | pmsg = (u16 *) info->DSPInfoBlk; | ||
1724 | *pmsg++ = 0; | ||
1725 | *pmsg++ = | ||
1726 | htons(info->DSPInfoBlklen + 20 + | ||
1727 | info->DSPInfoBlklen); | ||
1728 | ppseudo_hdr = | ||
1729 | (struct pseudo_hdr *)(u16 *) &info->DSPInfoBlk[2]; | ||
1730 | ppseudo_hdr->length = | ||
1731 | htons(info->DSPInfoBlklen + 4 + | ||
1732 | info->DSPInfoBlklen); | ||
1733 | ppseudo_hdr->source = 0x10; | ||
1734 | ppseudo_hdr->destination = 0x20; | ||
1735 | ppseudo_hdr->portdest = 0; | ||
1736 | ppseudo_hdr->portsrc = 0; | ||
1737 | ppseudo_hdr->sh_str_id = 0; | ||
1738 | ppseudo_hdr->control = 0; | ||
1739 | ppseudo_hdr->rsvd1 = 0; | ||
1740 | ppseudo_hdr->rsvd2 = 0; | ||
1741 | ppseudo_hdr->qos_class = 0; | ||
1742 | /* Insert slow queue sequence number */ | ||
1743 | ppseudo_hdr->seq_num = info->squeseqnum++; | ||
1744 | /* Insert application id */ | ||
1745 | ppseudo_hdr->portsrc = 0; | ||
1746 | /* Calculate new checksum */ | ||
1747 | ppseudo_hdr->checksum = *pmsg++; | ||
1748 | for (i = 1; i < 7; i++) | ||
1749 | ppseudo_hdr->checksum ^= *pmsg++; | ||
1649 | 1750 | ||
1650 | // kick off dspprov routine to start provisioning | 1751 | info->DSPInfoBlk[10] = 0x7200; |
1651 | // Send provisioning data to DSP | 1752 | info->DSPInfoBlk[11] = htons(info->DSPInfoBlklen); |
1652 | if (list_empty(&info->prov_list) == 0) | 1753 | status = |
1653 | { | 1754 | ft1000_write_dpram32(dev, 0, |
1654 | info->fProvComplete = 0; | 1755 | (u8 *) &info->DSPInfoBlk[0], |
1655 | status = ft1000_dsp_prov(dev); | 1756 | (unsigned short)(info-> |
1656 | if (status != STATUS_SUCCESS) | 1757 | DSPInfoBlklen |
1657 | goto out; | 1758 | + 22)); |
1658 | } | 1759 | status = |
1659 | else { | 1760 | ft1000_write_register(dev, FT1000_DB_DPRAM_TX, |
1660 | info->fProvComplete = 1; | 1761 | FT1000_REG_DOORBELL); |
1661 | status = ft1000_write_register (dev, FT1000_DB_HB, FT1000_REG_DOORBELL); | 1762 | info->DrvMsgPend = 0; |
1662 | DEBUG("FT1000:drivermsg:No more DSP provisioning data in dsp image\n"); | ||
1663 | } | ||
1664 | DEBUG("ft1000_proc_drvmsg:DSP PROVISION is done\n"); | ||
1665 | break; | ||
1666 | } | ||
1667 | case DSP_STORE_INFO: { | ||
1668 | DEBUG("ft1000_proc_drvmsg:Command message type = DSP_STORE_INFO"); | ||
1669 | |||
1670 | DEBUG("FT1000:drivermsg:Got DSP_STORE_INFO\n"); | ||
1671 | tempword = ntohs(pdrvmsg->length); | ||
1672 | info->DSPInfoBlklen = tempword; | ||
1673 | if (tempword < (MAX_DSP_SESS_REC-4) ) { | ||
1674 | pmsg = (u16 *)&pdrvmsg->data[0]; | ||
1675 | for (i=0; i<((tempword+1)/2); i++) { | ||
1676 | DEBUG("FT1000:drivermsg:dsp info data = 0x%x\n", *pmsg); | ||
1677 | info->DSPInfoBlk[i+10] = *pmsg++; | ||
1678 | } | ||
1679 | } | ||
1680 | else { | ||
1681 | info->DSPInfoBlklen = 0; | ||
1682 | } | ||
1683 | break; | ||
1684 | } | ||
1685 | case DSP_GET_INFO: { | ||
1686 | DEBUG("FT1000:drivermsg:Got DSP_GET_INFO\n"); | ||
1687 | // copy dsp info block to dsp | ||
1688 | info->DrvMsgPend = 1; | ||
1689 | // allow any outstanding ioctl to finish | ||
1690 | mdelay(10); | ||
1691 | status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL); | ||
1692 | if (tempword & FT1000_DB_DPRAM_TX) { | ||
1693 | mdelay(10); | ||
1694 | status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL); | ||
1695 | if (tempword & FT1000_DB_DPRAM_TX) { | ||
1696 | mdelay(10); | ||
1697 | status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL); | ||
1698 | if (tempword & FT1000_DB_DPRAM_TX) { | ||
1699 | break; | ||
1700 | } | ||
1701 | } | ||
1702 | } | ||
1703 | |||
1704 | // Put message into Slow Queue | ||
1705 | // Form Pseudo header | ||
1706 | pmsg = (u16 *)info->DSPInfoBlk; | ||
1707 | *pmsg++ = 0; | ||
1708 | *pmsg++ = htons(info->DSPInfoBlklen+20+info->DSPInfoBlklen); | ||
1709 | ppseudo_hdr = (struct pseudo_hdr *)(u16 *)&info->DSPInfoBlk[2]; | ||
1710 | ppseudo_hdr->length = htons(info->DSPInfoBlklen+4+info->DSPInfoBlklen); | ||
1711 | ppseudo_hdr->source = 0x10; | ||
1712 | ppseudo_hdr->destination = 0x20; | ||
1713 | ppseudo_hdr->portdest = 0; | ||
1714 | ppseudo_hdr->portsrc = 0; | ||
1715 | ppseudo_hdr->sh_str_id = 0; | ||
1716 | ppseudo_hdr->control = 0; | ||
1717 | ppseudo_hdr->rsvd1 = 0; | ||
1718 | ppseudo_hdr->rsvd2 = 0; | ||
1719 | ppseudo_hdr->qos_class = 0; | ||
1720 | // Insert slow queue sequence number | ||
1721 | ppseudo_hdr->seq_num = info->squeseqnum++; | ||
1722 | // Insert application id | ||
1723 | ppseudo_hdr->portsrc = 0; | ||
1724 | // Calculate new checksum | ||
1725 | ppseudo_hdr->checksum = *pmsg++; | ||
1726 | for (i=1; i<7; i++) { | ||
1727 | ppseudo_hdr->checksum ^= *pmsg++; | ||
1728 | } | ||
1729 | info->DSPInfoBlk[10] = 0x7200; | ||
1730 | info->DSPInfoBlk[11] = htons(info->DSPInfoBlklen); | ||
1731 | status = ft1000_write_dpram32 (dev, 0, (u8 *)&info->DSPInfoBlk[0], (unsigned short)(info->DSPInfoBlklen+22)); | ||
1732 | status = ft1000_write_register (dev, FT1000_DB_DPRAM_TX, FT1000_REG_DOORBELL); | ||
1733 | info->DrvMsgPend = 0; | ||
1734 | |||
1735 | break; | ||
1736 | } | ||
1737 | 1763 | ||
1738 | case GET_DRV_ERR_RPT_MSG: { | 1764 | break; |
1739 | DEBUG("FT1000:drivermsg:Got GET_DRV_ERR_RPT_MSG\n"); | 1765 | } |
1740 | // copy driver error message to dsp | 1766 | |
1741 | info->DrvMsgPend = 1; | 1767 | case GET_DRV_ERR_RPT_MSG:{ |
1742 | // allow any outstanding ioctl to finish | 1768 | DEBUG("FT1000:drivermsg:Got GET_DRV_ERR_RPT_MSG\n"); |
1743 | mdelay(10); | 1769 | /* copy driver error message to dsp */ |
1744 | status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL); | 1770 | info->DrvMsgPend = 1; |
1745 | if (tempword & FT1000_DB_DPRAM_TX) { | 1771 | /* allow any outstanding ioctl to finish */ |
1746 | mdelay(10); | 1772 | mdelay(10); |
1747 | status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL); | 1773 | status = |
1748 | if (tempword & FT1000_DB_DPRAM_TX) { | 1774 | ft1000_read_register(dev, &tempword, |
1749 | mdelay(10); | 1775 | FT1000_REG_DOORBELL); |
1750 | } | 1776 | if (tempword & FT1000_DB_DPRAM_TX) { |
1751 | } | 1777 | mdelay(10); |
1752 | 1778 | status = | |
1753 | if ( (tempword & FT1000_DB_DPRAM_TX) == 0) { | 1779 | ft1000_read_register(dev, &tempword, |
1754 | // Put message into Slow Queue | 1780 | FT1000_REG_DOORBELL); |
1755 | // Form Pseudo header | 1781 | if (tempword & FT1000_DB_DPRAM_TX) |
1756 | pmsg = (u16 *)&tempbuffer[0]; | 1782 | mdelay(10); |
1757 | ppseudo_hdr = (struct pseudo_hdr *)pmsg; | 1783 | } |
1758 | ppseudo_hdr->length = htons(0x0012); | ||
1759 | ppseudo_hdr->source = 0x10; | ||
1760 | ppseudo_hdr->destination = 0x20; | ||
1761 | ppseudo_hdr->portdest = 0; | ||
1762 | ppseudo_hdr->portsrc = 0; | ||
1763 | ppseudo_hdr->sh_str_id = 0; | ||
1764 | ppseudo_hdr->control = 0; | ||
1765 | ppseudo_hdr->rsvd1 = 0; | ||
1766 | ppseudo_hdr->rsvd2 = 0; | ||
1767 | ppseudo_hdr->qos_class = 0; | ||
1768 | // Insert slow queue sequence number | ||
1769 | ppseudo_hdr->seq_num = info->squeseqnum++; | ||
1770 | // Insert application id | ||
1771 | ppseudo_hdr->portsrc = 0; | ||
1772 | // Calculate new checksum | ||
1773 | ppseudo_hdr->checksum = *pmsg++; | ||
1774 | for (i=1; i<7; i++) { | ||
1775 | ppseudo_hdr->checksum ^= *pmsg++; | ||
1776 | } | ||
1777 | pmsg = (u16 *)&tempbuffer[16]; | ||
1778 | *pmsg++ = htons(RSP_DRV_ERR_RPT_MSG); | ||
1779 | *pmsg++ = htons(0x000e); | ||
1780 | *pmsg++ = htons(info->DSP_TIME[0]); | ||
1781 | *pmsg++ = htons(info->DSP_TIME[1]); | ||
1782 | *pmsg++ = htons(info->DSP_TIME[2]); | ||
1783 | *pmsg++ = htons(info->DSP_TIME[3]); | ||
1784 | convert.byte[0] = info->DspVer[0]; | ||
1785 | convert.byte[1] = info->DspVer[1]; | ||
1786 | *pmsg++ = convert.wrd; | ||
1787 | convert.byte[0] = info->DspVer[2]; | ||
1788 | convert.byte[1] = info->DspVer[3]; | ||
1789 | *pmsg++ = convert.wrd; | ||
1790 | *pmsg++ = htons(info->DrvErrNum); | ||
1791 | |||
1792 | card_send_command (dev, (unsigned char*)&tempbuffer[0], (u16)(0x0012 + PSEUDOSZ)); | ||
1793 | info->DrvErrNum = 0; | ||
1794 | } | ||
1795 | info->DrvMsgPend = 0; | ||
1796 | |||
1797 | break; | ||
1798 | } | ||
1799 | |||
1800 | default: | ||
1801 | break; | ||
1802 | } | ||
1803 | 1784 | ||
1785 | if ((tempword & FT1000_DB_DPRAM_TX) == 0) { | ||
1786 | /* Put message into Slow Queue | ||
1787 | * Form Pseudo header | ||
1788 | */ | ||
1789 | pmsg = (u16 *) &tempbuffer[0]; | ||
1790 | ppseudo_hdr = (struct pseudo_hdr *)pmsg; | ||
1791 | ppseudo_hdr->length = htons(0x0012); | ||
1792 | ppseudo_hdr->source = 0x10; | ||
1793 | ppseudo_hdr->destination = 0x20; | ||
1794 | ppseudo_hdr->portdest = 0; | ||
1795 | ppseudo_hdr->portsrc = 0; | ||
1796 | ppseudo_hdr->sh_str_id = 0; | ||
1797 | ppseudo_hdr->control = 0; | ||
1798 | ppseudo_hdr->rsvd1 = 0; | ||
1799 | ppseudo_hdr->rsvd2 = 0; | ||
1800 | ppseudo_hdr->qos_class = 0; | ||
1801 | /* Insert slow queue sequence number */ | ||
1802 | ppseudo_hdr->seq_num = info->squeseqnum++; | ||
1803 | /* Insert application id */ | ||
1804 | ppseudo_hdr->portsrc = 0; | ||
1805 | /* Calculate new checksum */ | ||
1806 | ppseudo_hdr->checksum = *pmsg++; | ||
1807 | for (i = 1; i < 7; i++) | ||
1808 | ppseudo_hdr->checksum ^= *pmsg++; | ||
1809 | |||
1810 | pmsg = (u16 *) &tempbuffer[16]; | ||
1811 | *pmsg++ = htons(RSP_DRV_ERR_RPT_MSG); | ||
1812 | *pmsg++ = htons(0x000e); | ||
1813 | *pmsg++ = htons(info->DSP_TIME[0]); | ||
1814 | *pmsg++ = htons(info->DSP_TIME[1]); | ||
1815 | *pmsg++ = htons(info->DSP_TIME[2]); | ||
1816 | *pmsg++ = htons(info->DSP_TIME[3]); | ||
1817 | convert.byte[0] = info->DspVer[0]; | ||
1818 | convert.byte[1] = info->DspVer[1]; | ||
1819 | *pmsg++ = convert.wrd; | ||
1820 | convert.byte[0] = info->DspVer[2]; | ||
1821 | convert.byte[1] = info->DspVer[3]; | ||
1822 | *pmsg++ = convert.wrd; | ||
1823 | *pmsg++ = htons(info->DrvErrNum); | ||
1824 | |||
1825 | card_send_command(dev, | ||
1826 | (unsigned char *)&tempbuffer[0], | ||
1827 | (u16) (0x0012 + PSEUDOSZ)); | ||
1828 | info->DrvErrNum = 0; | ||
1829 | } | ||
1830 | info->DrvMsgPend = 0; | ||
1804 | 1831 | ||
1805 | status = STATUS_SUCCESS; | 1832 | break; |
1806 | out: | 1833 | } |
1807 | kfree(cmdbuffer); | ||
1808 | DEBUG("return from ft1000_proc_drvmsg\n"); | ||
1809 | return status; | ||
1810 | } | ||
1811 | 1834 | ||
1835 | default: | ||
1836 | break; | ||
1837 | } | ||
1812 | 1838 | ||
1839 | status = STATUS_SUCCESS; | ||
1840 | out: | ||
1841 | kfree(cmdbuffer); | ||
1842 | DEBUG("return from ft1000_proc_drvmsg\n"); | ||
1843 | return status; | ||
1844 | } | ||
1813 | 1845 | ||
1814 | int ft1000_poll(void* dev_id) { | 1846 | int ft1000_poll(void* dev_id) { |
1815 | 1847 | ||