diff options
Diffstat (limited to 'drivers/char/pcmcia')
-rw-r--r-- | drivers/char/pcmcia/ipwireless/hardware.c | 50 |
1 files changed, 18 insertions, 32 deletions
diff --git a/drivers/char/pcmcia/ipwireless/hardware.c b/drivers/char/pcmcia/ipwireless/hardware.c index 929101ecbae2..6a3e666af019 100644 --- a/drivers/char/pcmcia/ipwireless/hardware.c +++ b/drivers/char/pcmcia/ipwireless/hardware.c | |||
@@ -389,7 +389,7 @@ static void dump_data_bytes(const char *type, const unsigned char *data, | |||
389 | static int do_send_fragment(struct ipw_hardware *hw, const unsigned char *data, | 389 | static int do_send_fragment(struct ipw_hardware *hw, const unsigned char *data, |
390 | unsigned length) | 390 | unsigned length) |
391 | { | 391 | { |
392 | int i; | 392 | unsigned i; |
393 | unsigned long flags; | 393 | unsigned long flags; |
394 | 394 | ||
395 | start_timing(); | 395 | start_timing(); |
@@ -414,7 +414,7 @@ static int do_send_fragment(struct ipw_hardware *hw, const unsigned char *data, | |||
414 | unsigned short d = data[i]; | 414 | unsigned short d = data[i]; |
415 | __le16 raw_data; | 415 | __le16 raw_data; |
416 | 416 | ||
417 | if (likely(i + 1 < length)) | 417 | if (i + 1 < length) |
418 | d |= data[i + 1] << 8; | 418 | d |= data[i + 1] << 8; |
419 | raw_data = cpu_to_le16(d); | 419 | raw_data = cpu_to_le16(d); |
420 | outw(raw_data, hw->base_port + IODWR); | 420 | outw(raw_data, hw->base_port + IODWR); |
@@ -428,7 +428,7 @@ static int do_send_fragment(struct ipw_hardware *hw, const unsigned char *data, | |||
428 | unsigned short d = data[i]; | 428 | unsigned short d = data[i]; |
429 | __le16 raw_data; | 429 | __le16 raw_data; |
430 | 430 | ||
431 | if ((i + 1 < length)) | 431 | if (i + 1 < length) |
432 | d |= data[i + 1] << 8; | 432 | d |= data[i + 1] << 8; |
433 | raw_data = cpu_to_le16(d); | 433 | raw_data = cpu_to_le16(d); |
434 | outw(raw_data, hw->base_port + IODMADPR); | 434 | outw(raw_data, hw->base_port + IODMADPR); |
@@ -549,12 +549,7 @@ static struct ipw_rx_packet *pool_allocate(struct ipw_hardware *hw, | |||
549 | if (!packet) { | 549 | if (!packet) { |
550 | unsigned long flags; | 550 | unsigned long flags; |
551 | 551 | ||
552 | /* | ||
553 | * If this is the first fragment, then we will need to fetch a | ||
554 | * packet to put it in. | ||
555 | */ | ||
556 | spin_lock_irqsave(&hw->spinlock, flags); | 552 | spin_lock_irqsave(&hw->spinlock, flags); |
557 | /* If we have one in our pool, then pull it out. */ | ||
558 | if (!list_empty(&hw->rx_pool)) { | 553 | if (!list_empty(&hw->rx_pool)) { |
559 | packet = list_first_entry(&hw->rx_pool, | 554 | packet = list_first_entry(&hw->rx_pool, |
560 | struct ipw_rx_packet, queue); | 555 | struct ipw_rx_packet, queue); |
@@ -562,15 +557,14 @@ static struct ipw_rx_packet *pool_allocate(struct ipw_hardware *hw, | |||
562 | hw->rx_pool_size--; | 557 | hw->rx_pool_size--; |
563 | spin_unlock_irqrestore(&hw->spinlock, flags); | 558 | spin_unlock_irqrestore(&hw->spinlock, flags); |
564 | } else { | 559 | } else { |
565 | /* Otherwise allocate a new one. */ | ||
566 | static int min_capacity = 256; | 560 | static int min_capacity = 256; |
567 | int new_capacity; | 561 | int new_capacity; |
568 | 562 | ||
569 | spin_unlock_irqrestore(&hw->spinlock, flags); | 563 | spin_unlock_irqrestore(&hw->spinlock, flags); |
570 | new_capacity = | 564 | new_capacity = |
571 | minimum_free_space > min_capacity | 565 | (minimum_free_space > min_capacity |
572 | ? minimum_free_space | 566 | ? minimum_free_space |
573 | : min_capacity; | 567 | : min_capacity); |
574 | packet = kmalloc(sizeof(struct ipw_rx_packet) | 568 | packet = kmalloc(sizeof(struct ipw_rx_packet) |
575 | + new_capacity, GFP_ATOMIC); | 569 | + new_capacity, GFP_ATOMIC); |
576 | if (!packet) | 570 | if (!packet) |
@@ -580,10 +574,6 @@ static struct ipw_rx_packet *pool_allocate(struct ipw_hardware *hw, | |||
580 | packet->length = 0; | 574 | packet->length = 0; |
581 | } | 575 | } |
582 | 576 | ||
583 | /* | ||
584 | * If this packet does not have sufficient capacity for the data we | ||
585 | * want to add, then make it bigger. | ||
586 | */ | ||
587 | if (packet->length + minimum_free_space > packet->capacity) { | 577 | if (packet->length + minimum_free_space > packet->capacity) { |
588 | struct ipw_rx_packet *old_packet = packet; | 578 | struct ipw_rx_packet *old_packet = packet; |
589 | 579 | ||
@@ -686,7 +676,7 @@ static void queue_received_packet(struct ipw_hardware *hw, | |||
686 | list_add_tail(&packet->queue, &hw->rx_queue); | 676 | list_add_tail(&packet->queue, &hw->rx_queue); |
687 | /* Block reception of incoming packets if queue is full. */ | 677 | /* Block reception of incoming packets if queue is full. */ |
688 | hw->blocking_rx = | 678 | hw->blocking_rx = |
689 | hw->rx_bytes_queued >= IPWIRELESS_RX_QUEUE_SIZE; | 679 | (hw->rx_bytes_queued >= IPWIRELESS_RX_QUEUE_SIZE); |
690 | 680 | ||
691 | spin_unlock_irqrestore(&hw->spinlock, flags); | 681 | spin_unlock_irqrestore(&hw->spinlock, flags); |
692 | schedule_work(&hw->work_rx); | 682 | schedule_work(&hw->work_rx); |
@@ -850,7 +840,7 @@ static void acknowledge_data_read(struct ipw_hardware *hw) | |||
850 | static void do_receive_packet(struct ipw_hardware *hw) | 840 | static void do_receive_packet(struct ipw_hardware *hw) |
851 | { | 841 | { |
852 | unsigned len; | 842 | unsigned len; |
853 | unsigned int i; | 843 | unsigned i; |
854 | unsigned char pkt[LL_MTU_MAX]; | 844 | unsigned char pkt[LL_MTU_MAX]; |
855 | 845 | ||
856 | start_timing(); | 846 | start_timing(); |
@@ -916,8 +906,7 @@ static int get_current_packet_priority(struct ipw_hardware *hw) | |||
916 | * until setup is complete. | 906 | * until setup is complete. |
917 | */ | 907 | */ |
918 | return (hw->to_setup || hw->initializing | 908 | return (hw->to_setup || hw->initializing |
919 | ? PRIO_SETUP + 1 : | 909 | ? PRIO_SETUP + 1 : NL_NUM_OF_PRIORITIES); |
920 | NL_NUM_OF_PRIORITIES); | ||
921 | } | 910 | } |
922 | 911 | ||
923 | /* | 912 | /* |
@@ -1128,9 +1117,8 @@ static irqreturn_t ipwireless_handle_v2_v3_interrupt(int irq, | |||
1128 | } else { | 1117 | } else { |
1129 | return IRQ_NONE; | 1118 | return IRQ_NONE; |
1130 | } | 1119 | } |
1131 | } else { | 1120 | } else |
1132 | return IRQ_NONE; | 1121 | return IRQ_NONE; |
1133 | } | ||
1134 | } | 1122 | } |
1135 | 1123 | ||
1136 | /* | 1124 | /* |
@@ -1297,15 +1285,14 @@ int ipwireless_send_packet(struct ipw_hardware *hw, unsigned int channel_idx, | |||
1297 | { | 1285 | { |
1298 | struct ipw_tx_packet *packet; | 1286 | struct ipw_tx_packet *packet; |
1299 | 1287 | ||
1300 | packet = alloc_data_packet(length, | 1288 | packet = alloc_data_packet(length, (channel_idx + 1), |
1301 | (unsigned char) (channel_idx + 1), | 1289 | TL_PROTOCOLID_COM_DATA); |
1302 | TL_PROTOCOLID_COM_DATA); | ||
1303 | if (!packet) | 1290 | if (!packet) |
1304 | return -ENOMEM; | 1291 | return -ENOMEM; |
1305 | packet->packet_callback = callback; | 1292 | packet->packet_callback = callback; |
1306 | packet->callback_data = callback_data; | 1293 | packet->callback_data = callback_data; |
1307 | memcpy((unsigned char *) packet + | 1294 | memcpy((unsigned char *) packet + sizeof(struct ipw_tx_packet), data, |
1308 | sizeof(struct ipw_tx_packet), data, length); | 1295 | length); |
1309 | 1296 | ||
1310 | send_packet(hw, PRIO_DATA, packet); | 1297 | send_packet(hw, PRIO_DATA, packet); |
1311 | return 0; | 1298 | return 0; |
@@ -1321,12 +1308,11 @@ static int set_control_line(struct ipw_hardware *hw, int prio, | |||
1321 | protocolid = TL_PROTOCOLID_SETUP; | 1308 | protocolid = TL_PROTOCOLID_SETUP; |
1322 | 1309 | ||
1323 | packet = alloc_ctrl_packet(sizeof(struct ipw_control_packet), | 1310 | packet = alloc_ctrl_packet(sizeof(struct ipw_control_packet), |
1324 | (unsigned char) (channel_idx + 1), | 1311 | (channel_idx + 1), protocolid, line); |
1325 | protocolid, line); | ||
1326 | if (!packet) | 1312 | if (!packet) |
1327 | return -ENOMEM; | 1313 | return -ENOMEM; |
1328 | packet->header.length = sizeof(struct ipw_control_packet_body); | 1314 | packet->header.length = sizeof(struct ipw_control_packet_body); |
1329 | packet->body.value = (unsigned char) (state == 0 ? 0 : 1); | 1315 | packet->body.value = (state == 0 ? 0 : 1); |
1330 | send_packet(hw, prio, &packet->header); | 1316 | send_packet(hw, prio, &packet->header); |
1331 | return 0; | 1317 | return 0; |
1332 | } | 1318 | } |
@@ -1651,8 +1637,8 @@ void ipwireless_init_hardware_v1(struct ipw_hardware *hw, | |||
1651 | enable_irq(hw->irq); | 1637 | enable_irq(hw->irq); |
1652 | } | 1638 | } |
1653 | hw->base_port = base_port; | 1639 | hw->base_port = base_port; |
1654 | hw->hw_version = is_v2_card ? HW_VERSION_2 : HW_VERSION_1; | 1640 | hw->hw_version = (is_v2_card ? HW_VERSION_2 : HW_VERSION_1); |
1655 | hw->ll_mtu = hw->hw_version == HW_VERSION_1 ? LL_MTU_V1 : LL_MTU_V2; | 1641 | hw->ll_mtu = (hw->hw_version == HW_VERSION_1 ? LL_MTU_V1 : LL_MTU_V2); |
1656 | hw->memregs_CCR = (struct MEMCCR __iomem *) | 1642 | hw->memregs_CCR = (struct MEMCCR __iomem *) |
1657 | ((unsigned short __iomem *) attr_memory + 0x200); | 1643 | ((unsigned short __iomem *) attr_memory + 0x200); |
1658 | hw->memory_info_regs = (struct MEMINFREG __iomem *) common_memory; | 1644 | hw->memory_info_regs = (struct MEMINFREG __iomem *) common_memory; |