diff options
Diffstat (limited to 'drivers/net/wireless/netwave_cs.c')
| -rw-r--r-- | drivers/net/wireless/netwave_cs.c | 95 |
1 files changed, 38 insertions, 57 deletions
diff --git a/drivers/net/wireless/netwave_cs.c b/drivers/net/wireless/netwave_cs.c index 9498b46c99a4..e61e6b9440ab 100644 --- a/drivers/net/wireless/netwave_cs.c +++ b/drivers/net/wireless/netwave_cs.c | |||
| @@ -145,23 +145,6 @@ static const unsigned int txConfEUD = 0x10; /* Enable Uni-Data packets */ | |||
| 145 | static const unsigned int txConfKey = 0x02; /* Scramble data packets */ | 145 | static const unsigned int txConfKey = 0x02; /* Scramble data packets */ |
| 146 | static const unsigned int txConfLoop = 0x01; /* Loopback mode */ | 146 | static const unsigned int txConfLoop = 0x01; /* Loopback mode */ |
| 147 | 147 | ||
| 148 | /* | ||
| 149 | All the PCMCIA modules use PCMCIA_DEBUG to control debugging. If | ||
| 150 | you do not define PCMCIA_DEBUG at all, all the debug code will be | ||
| 151 | left out. If you compile with PCMCIA_DEBUG=0, the debug code will | ||
| 152 | be present but disabled -- but it can then be enabled for specific | ||
| 153 | modules at load time with a 'pc_debug=#' option to insmod. | ||
| 154 | */ | ||
| 155 | |||
| 156 | #ifdef PCMCIA_DEBUG | ||
| 157 | static int pc_debug = PCMCIA_DEBUG; | ||
| 158 | module_param(pc_debug, int, 0); | ||
| 159 | #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args) | ||
| 160 | static char *version = | ||
| 161 | "netwave_cs.c 0.3.0 Thu Jul 17 14:36:02 1997 (John Markus Bjørndalen)\n"; | ||
| 162 | #else | ||
| 163 | #define DEBUG(n, args...) | ||
| 164 | #endif | ||
| 165 | 148 | ||
| 166 | /*====================================================================*/ | 149 | /*====================================================================*/ |
| 167 | 150 | ||
| @@ -383,7 +366,7 @@ static int netwave_probe(struct pcmcia_device *link) | |||
| 383 | struct net_device *dev; | 366 | struct net_device *dev; |
| 384 | netwave_private *priv; | 367 | netwave_private *priv; |
| 385 | 368 | ||
| 386 | DEBUG(0, "netwave_attach()\n"); | 369 | dev_dbg(&link->dev, "netwave_attach()\n"); |
| 387 | 370 | ||
| 388 | /* Initialize the struct pcmcia_device structure */ | 371 | /* Initialize the struct pcmcia_device structure */ |
| 389 | dev = alloc_etherdev(sizeof(netwave_private)); | 372 | dev = alloc_etherdev(sizeof(netwave_private)); |
| @@ -401,8 +384,7 @@ static int netwave_probe(struct pcmcia_device *link) | |||
| 401 | link->io.IOAddrLines = 5; | 384 | link->io.IOAddrLines = 5; |
| 402 | 385 | ||
| 403 | /* Interrupt setup */ | 386 | /* Interrupt setup */ |
| 404 | link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING | IRQ_HANDLE_PRESENT; | 387 | link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING; |
| 405 | link->irq.IRQInfo1 = IRQ_LEVEL_ID; | ||
| 406 | link->irq.Handler = &netwave_interrupt; | 388 | link->irq.Handler = &netwave_interrupt; |
| 407 | 389 | ||
| 408 | /* General socket configuration */ | 390 | /* General socket configuration */ |
| @@ -421,8 +403,6 @@ static int netwave_probe(struct pcmcia_device *link) | |||
| 421 | 403 | ||
| 422 | dev->watchdog_timeo = TX_TIMEOUT; | 404 | dev->watchdog_timeo = TX_TIMEOUT; |
| 423 | 405 | ||
| 424 | link->irq.Instance = dev; | ||
| 425 | |||
| 426 | return netwave_pcmcia_config( link); | 406 | return netwave_pcmcia_config( link); |
| 427 | } /* netwave_attach */ | 407 | } /* netwave_attach */ |
| 428 | 408 | ||
| @@ -438,7 +418,7 @@ static void netwave_detach(struct pcmcia_device *link) | |||
| 438 | { | 418 | { |
| 439 | struct net_device *dev = link->priv; | 419 | struct net_device *dev = link->priv; |
| 440 | 420 | ||
| 441 | DEBUG(0, "netwave_detach(0x%p)\n", link); | 421 | dev_dbg(&link->dev, "netwave_detach\n"); |
| 442 | 422 | ||
| 443 | netwave_release(link); | 423 | netwave_release(link); |
| 444 | 424 | ||
| @@ -725,18 +705,15 @@ static const struct iw_handler_def netwave_handler_def = | |||
| 725 | * | 705 | * |
| 726 | */ | 706 | */ |
| 727 | 707 | ||
| 728 | #define CS_CHECK(fn, ret) \ | ||
| 729 | do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) | ||
| 730 | |||
| 731 | static int netwave_pcmcia_config(struct pcmcia_device *link) { | 708 | static int netwave_pcmcia_config(struct pcmcia_device *link) { |
| 732 | struct net_device *dev = link->priv; | 709 | struct net_device *dev = link->priv; |
| 733 | netwave_private *priv = netdev_priv(dev); | 710 | netwave_private *priv = netdev_priv(dev); |
| 734 | int i, j, last_ret, last_fn; | 711 | int i, j, ret; |
| 735 | win_req_t req; | 712 | win_req_t req; |
| 736 | memreq_t mem; | 713 | memreq_t mem; |
| 737 | u_char __iomem *ramBase = NULL; | 714 | u_char __iomem *ramBase = NULL; |
| 738 | 715 | ||
| 739 | DEBUG(0, "netwave_pcmcia_config(0x%p)\n", link); | 716 | dev_dbg(&link->dev, "netwave_pcmcia_config\n"); |
| 740 | 717 | ||
| 741 | /* | 718 | /* |
| 742 | * Try allocating IO ports. This tries a few fixed addresses. | 719 | * Try allocating IO ports. This tries a few fixed addresses. |
| @@ -749,22 +726,24 @@ static int netwave_pcmcia_config(struct pcmcia_device *link) { | |||
| 749 | if (i == 0) | 726 | if (i == 0) |
| 750 | break; | 727 | break; |
| 751 | } | 728 | } |
| 752 | if (i != 0) { | 729 | if (i != 0) |
| 753 | cs_error(link, RequestIO, i); | ||
| 754 | goto failed; | 730 | goto failed; |
| 755 | } | ||
| 756 | 731 | ||
| 757 | /* | 732 | /* |
| 758 | * Now allocate an interrupt line. Note that this does not | 733 | * Now allocate an interrupt line. Note that this does not |
| 759 | * actually assign a handler to the interrupt. | 734 | * actually assign a handler to the interrupt. |
| 760 | */ | 735 | */ |
| 761 | CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); | 736 | ret = pcmcia_request_irq(link, &link->irq); |
| 737 | if (ret) | ||
| 738 | goto failed; | ||
| 762 | 739 | ||
| 763 | /* | 740 | /* |
| 764 | * This actually configures the PCMCIA socket -- setting up | 741 | * This actually configures the PCMCIA socket -- setting up |
| 765 | * the I/O windows and the interrupt mapping. | 742 | * the I/O windows and the interrupt mapping. |
| 766 | */ | 743 | */ |
| 767 | CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); | 744 | ret = pcmcia_request_configuration(link, &link->conf); |
| 745 | if (ret) | ||
| 746 | goto failed; | ||
| 768 | 747 | ||
| 769 | /* | 748 | /* |
| 770 | * Allocate a 32K memory window. Note that the struct pcmcia_device | 749 | * Allocate a 32K memory window. Note that the struct pcmcia_device |
| @@ -772,14 +751,18 @@ static int netwave_pcmcia_config(struct pcmcia_device *link) { | |||
| 772 | * device needs several windows, you'll need to keep track of | 751 | * device needs several windows, you'll need to keep track of |
| 773 | * the handles in your private data structure, dev->priv. | 752 | * the handles in your private data structure, dev->priv. |
| 774 | */ | 753 | */ |
| 775 | DEBUG(1, "Setting mem speed of %d\n", mem_speed); | 754 | dev_dbg(&link->dev, "Setting mem speed of %d\n", mem_speed); |
| 776 | 755 | ||
| 777 | req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_CM|WIN_ENABLE; | 756 | req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_CM|WIN_ENABLE; |
| 778 | req.Base = 0; req.Size = 0x8000; | 757 | req.Base = 0; req.Size = 0x8000; |
| 779 | req.AccessSpeed = mem_speed; | 758 | req.AccessSpeed = mem_speed; |
| 780 | CS_CHECK(RequestWindow, pcmcia_request_window(&link, &req, &link->win)); | 759 | ret = pcmcia_request_window(link, &req, &link->win); |
| 760 | if (ret) | ||
| 761 | goto failed; | ||
| 781 | mem.CardOffset = 0x20000; mem.Page = 0; | 762 | mem.CardOffset = 0x20000; mem.Page = 0; |
| 782 | CS_CHECK(MapMemPage, pcmcia_map_mem_page(link->win, &mem)); | 763 | ret = pcmcia_map_mem_page(link, link->win, &mem); |
| 764 | if (ret) | ||
| 765 | goto failed; | ||
| 783 | 766 | ||
| 784 | /* Store base address of the common window frame */ | 767 | /* Store base address of the common window frame */ |
| 785 | ramBase = ioremap(req.Base, 0x8000); | 768 | ramBase = ioremap(req.Base, 0x8000); |
| @@ -787,7 +770,7 @@ static int netwave_pcmcia_config(struct pcmcia_device *link) { | |||
| 787 | 770 | ||
| 788 | dev->irq = link->irq.AssignedIRQ; | 771 | dev->irq = link->irq.AssignedIRQ; |
| 789 | dev->base_addr = link->io.BasePort1; | 772 | dev->base_addr = link->io.BasePort1; |
| 790 | SET_NETDEV_DEV(dev, &handle_to_dev(link)); | 773 | SET_NETDEV_DEV(dev, &link->dev); |
| 791 | 774 | ||
| 792 | if (register_netdev(dev) != 0) { | 775 | if (register_netdev(dev) != 0) { |
| 793 | printk(KERN_DEBUG "netwave_cs: register_netdev() failed\n"); | 776 | printk(KERN_DEBUG "netwave_cs: register_netdev() failed\n"); |
| @@ -818,8 +801,6 @@ static int netwave_pcmcia_config(struct pcmcia_device *link) { | |||
| 818 | get_uint16(ramBase + NETWAVE_EREG_ARW+2)); | 801 | get_uint16(ramBase + NETWAVE_EREG_ARW+2)); |
| 819 | return 0; | 802 | return 0; |
| 820 | 803 | ||
| 821 | cs_failed: | ||
| 822 | cs_error(link, last_fn, last_ret); | ||
| 823 | failed: | 804 | failed: |
| 824 | netwave_release(link); | 805 | netwave_release(link); |
| 825 | return -ENODEV; | 806 | return -ENODEV; |
| @@ -837,7 +818,7 @@ static void netwave_release(struct pcmcia_device *link) | |||
| 837 | struct net_device *dev = link->priv; | 818 | struct net_device *dev = link->priv; |
| 838 | netwave_private *priv = netdev_priv(dev); | 819 | netwave_private *priv = netdev_priv(dev); |
| 839 | 820 | ||
| 840 | DEBUG(0, "netwave_release(0x%p)\n", link); | 821 | dev_dbg(&link->dev, "netwave_release\n"); |
| 841 | 822 | ||
| 842 | pcmcia_disable_device(link); | 823 | pcmcia_disable_device(link); |
| 843 | if (link->win) | 824 | if (link->win) |
| @@ -892,7 +873,7 @@ static void netwave_reset(struct net_device *dev) { | |||
| 892 | u_char __iomem *ramBase = priv->ramBase; | 873 | u_char __iomem *ramBase = priv->ramBase; |
| 893 | unsigned int iobase = dev->base_addr; | 874 | unsigned int iobase = dev->base_addr; |
| 894 | 875 | ||
| 895 | DEBUG(0, "netwave_reset: Done with hardware reset\n"); | 876 | pr_debug("netwave_reset: Done with hardware reset\n"); |
| 896 | 877 | ||
| 897 | priv->timeoutCounter = 0; | 878 | priv->timeoutCounter = 0; |
| 898 | 879 | ||
| @@ -988,7 +969,7 @@ static int netwave_hw_xmit(unsigned char* data, int len, | |||
| 988 | 969 | ||
| 989 | dev->stats.tx_bytes += len; | 970 | dev->stats.tx_bytes += len; |
| 990 | 971 | ||
| 991 | DEBUG(3, "Transmitting with SPCQ %x SPU %x LIF %x ISPLQ %x\n", | 972 | pr_debug("Transmitting with SPCQ %x SPU %x LIF %x ISPLQ %x\n", |
| 992 | readb(ramBase + NETWAVE_EREG_SPCQ), | 973 | readb(ramBase + NETWAVE_EREG_SPCQ), |
| 993 | readb(ramBase + NETWAVE_EREG_SPU), | 974 | readb(ramBase + NETWAVE_EREG_SPU), |
| 994 | readb(ramBase + NETWAVE_EREG_LIF), | 975 | readb(ramBase + NETWAVE_EREG_LIF), |
| @@ -1000,7 +981,7 @@ static int netwave_hw_xmit(unsigned char* data, int len, | |||
| 1000 | MaxData = get_uint16(ramBase + NETWAVE_EREG_TDP+2); | 981 | MaxData = get_uint16(ramBase + NETWAVE_EREG_TDP+2); |
| 1001 | DataOffset = get_uint16(ramBase + NETWAVE_EREG_TDP+4); | 982 | DataOffset = get_uint16(ramBase + NETWAVE_EREG_TDP+4); |
| 1002 | 983 | ||
| 1003 | DEBUG(3, "TxFreeList %x, MaxData %x, DataOffset %x\n", | 984 | pr_debug("TxFreeList %x, MaxData %x, DataOffset %x\n", |
| 1004 | TxFreeList, MaxData, DataOffset); | 985 | TxFreeList, MaxData, DataOffset); |
| 1005 | 986 | ||
| 1006 | /* Copy packet to the adapter fragment buffers */ | 987 | /* Copy packet to the adapter fragment buffers */ |
| @@ -1088,7 +1069,7 @@ static irqreturn_t netwave_interrupt(int irq, void* dev_id) | |||
| 1088 | status = inb(iobase + NETWAVE_REG_ASR); | 1069 | status = inb(iobase + NETWAVE_REG_ASR); |
| 1089 | 1070 | ||
| 1090 | if (!pcmcia_dev_present(link)) { | 1071 | if (!pcmcia_dev_present(link)) { |
| 1091 | DEBUG(1, "netwave_interrupt: Interrupt with status 0x%x " | 1072 | pr_debug("netwave_interrupt: Interrupt with status 0x%x " |
| 1092 | "from removed or suspended card!\n", status); | 1073 | "from removed or suspended card!\n", status); |
| 1093 | break; | 1074 | break; |
| 1094 | } | 1075 | } |
| @@ -1132,7 +1113,7 @@ static irqreturn_t netwave_interrupt(int irq, void* dev_id) | |||
| 1132 | int txStatus; | 1113 | int txStatus; |
| 1133 | 1114 | ||
| 1134 | txStatus = readb(ramBase + NETWAVE_EREG_TSER); | 1115 | txStatus = readb(ramBase + NETWAVE_EREG_TSER); |
| 1135 | DEBUG(3, "Transmit done. TSER = %x id %x\n", | 1116 | pr_debug("Transmit done. TSER = %x id %x\n", |
| 1136 | txStatus, readb(ramBase + NETWAVE_EREG_TSER + 1)); | 1117 | txStatus, readb(ramBase + NETWAVE_EREG_TSER + 1)); |
| 1137 | 1118 | ||
| 1138 | if (txStatus & 0x20) { | 1119 | if (txStatus & 0x20) { |
| @@ -1156,7 +1137,7 @@ static irqreturn_t netwave_interrupt(int irq, void* dev_id) | |||
| 1156 | * TxGU and TxNOAP is set. (Those are the only ones | 1137 | * TxGU and TxNOAP is set. (Those are the only ones |
| 1157 | * to set TxErr). | 1138 | * to set TxErr). |
| 1158 | */ | 1139 | */ |
| 1159 | DEBUG(3, "netwave_interrupt: TxDN with error status %x\n", | 1140 | pr_debug("netwave_interrupt: TxDN with error status %x\n", |
| 1160 | txStatus); | 1141 | txStatus); |
| 1161 | 1142 | ||
| 1162 | /* Clear out TxGU, TxNOAP, TxErr and TxTrys */ | 1143 | /* Clear out TxGU, TxNOAP, TxErr and TxTrys */ |
| @@ -1164,7 +1145,7 @@ static irqreturn_t netwave_interrupt(int irq, void* dev_id) | |||
| 1164 | writeb(0xdf & txStatus, ramBase+NETWAVE_EREG_TSER+4); | 1145 | writeb(0xdf & txStatus, ramBase+NETWAVE_EREG_TSER+4); |
| 1165 | ++dev->stats.tx_errors; | 1146 | ++dev->stats.tx_errors; |
| 1166 | } | 1147 | } |
| 1167 | DEBUG(3, "New status is TSER %x ASR %x\n", | 1148 | pr_debug("New status is TSER %x ASR %x\n", |
| 1168 | readb(ramBase + NETWAVE_EREG_TSER), | 1149 | readb(ramBase + NETWAVE_EREG_TSER), |
| 1169 | inb(iobase + NETWAVE_REG_ASR)); | 1150 | inb(iobase + NETWAVE_REG_ASR)); |
| 1170 | 1151 | ||
| @@ -1172,7 +1153,7 @@ static irqreturn_t netwave_interrupt(int irq, void* dev_id) | |||
| 1172 | } | 1153 | } |
| 1173 | /* TxBA, this would trigger on all error packets received */ | 1154 | /* TxBA, this would trigger on all error packets received */ |
| 1174 | /* if (status & 0x01) { | 1155 | /* if (status & 0x01) { |
| 1175 | DEBUG(4, "Transmit buffers available, %x\n", status); | 1156 | pr_debug("Transmit buffers available, %x\n", status); |
| 1176 | } | 1157 | } |
| 1177 | */ | 1158 | */ |
| 1178 | } | 1159 | } |
| @@ -1190,7 +1171,7 @@ static irqreturn_t netwave_interrupt(int irq, void* dev_id) | |||
| 1190 | */ | 1171 | */ |
| 1191 | static void netwave_watchdog(struct net_device *dev) { | 1172 | static void netwave_watchdog(struct net_device *dev) { |
| 1192 | 1173 | ||
| 1193 | DEBUG(1, "%s: netwave_watchdog: watchdog timer expired\n", dev->name); | 1174 | pr_debug("%s: netwave_watchdog: watchdog timer expired\n", dev->name); |
| 1194 | netwave_reset(dev); | 1175 | netwave_reset(dev); |
| 1195 | dev->trans_start = jiffies; | 1176 | dev->trans_start = jiffies; |
| 1196 | netif_wake_queue(dev); | 1177 | netif_wake_queue(dev); |
| @@ -1211,7 +1192,7 @@ static int netwave_rx(struct net_device *dev) | |||
| 1211 | int i; | 1192 | int i; |
| 1212 | u_char *ptr; | 1193 | u_char *ptr; |
| 1213 | 1194 | ||
| 1214 | DEBUG(3, "xinw_rx: Receiving ... \n"); | 1195 | pr_debug("xinw_rx: Receiving ... \n"); |
| 1215 | 1196 | ||
| 1216 | /* Receive max 10 packets for now. */ | 1197 | /* Receive max 10 packets for now. */ |
| 1217 | for (i = 0; i < 10; i++) { | 1198 | for (i = 0; i < 10; i++) { |
| @@ -1237,7 +1218,7 @@ static int netwave_rx(struct net_device *dev) | |||
| 1237 | 1218 | ||
| 1238 | skb = dev_alloc_skb(rcvLen+5); | 1219 | skb = dev_alloc_skb(rcvLen+5); |
| 1239 | if (skb == NULL) { | 1220 | if (skb == NULL) { |
| 1240 | DEBUG(1, "netwave_rx: Could not allocate an sk_buff of " | 1221 | pr_debug("netwave_rx: Could not allocate an sk_buff of " |
| 1241 | "length %d\n", rcvLen); | 1222 | "length %d\n", rcvLen); |
| 1242 | ++dev->stats.rx_dropped; | 1223 | ++dev->stats.rx_dropped; |
| 1243 | /* Tell the adapter to skip the packet */ | 1224 | /* Tell the adapter to skip the packet */ |
| @@ -1279,7 +1260,7 @@ static int netwave_rx(struct net_device *dev) | |||
| 1279 | wait_WOC(iobase); | 1260 | wait_WOC(iobase); |
| 1280 | writeb(NETWAVE_CMD_SRP, ramBase + NETWAVE_EREG_CB + 0); | 1261 | writeb(NETWAVE_CMD_SRP, ramBase + NETWAVE_EREG_CB + 0); |
| 1281 | writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 1); | 1262 | writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 1); |
| 1282 | DEBUG(3, "Packet reception ok\n"); | 1263 | pr_debug("Packet reception ok\n"); |
| 1283 | } | 1264 | } |
| 1284 | return 0; | 1265 | return 0; |
| 1285 | } | 1266 | } |
| @@ -1288,7 +1269,7 @@ static int netwave_open(struct net_device *dev) { | |||
| 1288 | netwave_private *priv = netdev_priv(dev); | 1269 | netwave_private *priv = netdev_priv(dev); |
| 1289 | struct pcmcia_device *link = priv->p_dev; | 1270 | struct pcmcia_device *link = priv->p_dev; |
| 1290 | 1271 | ||
| 1291 | DEBUG(1, "netwave_open: starting.\n"); | 1272 | dev_dbg(&link->dev, "netwave_open: starting.\n"); |
| 1292 | 1273 | ||
| 1293 | if (!pcmcia_dev_present(link)) | 1274 | if (!pcmcia_dev_present(link)) |
| 1294 | return -ENODEV; | 1275 | return -ENODEV; |
| @@ -1305,7 +1286,7 @@ static int netwave_close(struct net_device *dev) { | |||
| 1305 | netwave_private *priv = netdev_priv(dev); | 1286 | netwave_private *priv = netdev_priv(dev); |
| 1306 | struct pcmcia_device *link = priv->p_dev; | 1287 | struct pcmcia_device *link = priv->p_dev; |
| 1307 | 1288 | ||
| 1308 | DEBUG(1, "netwave_close: finishing.\n"); | 1289 | dev_dbg(&link->dev, "netwave_close: finishing.\n"); |
| 1309 | 1290 | ||
| 1310 | link->open--; | 1291 | link->open--; |
| 1311 | netif_stop_queue(dev); | 1292 | netif_stop_queue(dev); |
| @@ -1358,11 +1339,11 @@ static void set_multicast_list(struct net_device *dev) | |||
| 1358 | u_char rcvMode = 0; | 1339 | u_char rcvMode = 0; |
| 1359 | 1340 | ||
| 1360 | #ifdef PCMCIA_DEBUG | 1341 | #ifdef PCMCIA_DEBUG |
| 1361 | if (pc_debug > 2) { | 1342 | { |
| 1362 | static int old; | 1343 | xstatic int old; |
| 1363 | if (old != dev->mc_count) { | 1344 | if (old != dev->mc_count) { |
| 1364 | old = dev->mc_count; | 1345 | old = dev->mc_count; |
| 1365 | DEBUG(0, "%s: setting Rx mode to %d addresses.\n", | 1346 | pr_debug("%s: setting Rx mode to %d addresses.\n", |
| 1366 | dev->name, dev->mc_count); | 1347 | dev->name, dev->mc_count); |
| 1367 | } | 1348 | } |
| 1368 | } | 1349 | } |
