The hv driver has it's own linked list routines. This removes them from NetVsc and uses the kernels routines instead. Signed-off-by: Bill Pemberton <wfp5p@xxxxxxxxxxxx> --- drivers/staging/hv/NetVsc.c | 61 +++++++++++++++++---------------------- drivers/staging/hv/NetVsc.h | 4 +- drivers/staging/hv/NetVscApi.h | 4 +- 3 files changed, 31 insertions(+), 38 deletions(-) diff --git a/drivers/staging/hv/NetVsc.c b/drivers/staging/hv/NetVsc.c index fb1cbf0..e5b45e4 100644 --- a/drivers/staging/hv/NetVsc.c +++ b/drivers/staging/hv/NetVsc.c @@ -800,9 +800,9 @@ NetVscOnDeviceAdd( struct NETVSC_DEVICE *netDevice; struct hv_netvsc_packet *packet; - LIST_ENTRY *entry; - struct netvsc_driver *netDriver = (struct netvsc_driver *)Device->Driver; + struct list_head *pos; + struct list_head *pos2; DPRINT_ENTER(NETVSC); @@ -821,7 +821,7 @@ NetVscOnDeviceAdd( netDevice->SendBufferSize = NETVSC_SEND_BUFFER_SIZE; - INITIALIZE_LIST_HEAD(&netDevice->ReceivePacketList); + INIT_LIST_HEAD(&netDevice->ReceivePacketList); for (i=0; i < NETVSC_RECEIVE_PACKETLIST_COUNT; i++) { @@ -832,7 +832,7 @@ NetVscOnDeviceAdd( break; } - INSERT_TAIL_LIST(&netDevice->ReceivePacketList, &packet->ListEntry); + list_add_tail(&packet->ListEntry, &netDevice->ReceivePacketList); } netDevice->ChannelInitEvent = osd_WaitEventCreate(); @@ -879,10 +879,10 @@ Cleanup: { kfree(netDevice->ChannelInitEvent); - while (!IsListEmpty(&netDevice->ReceivePacketList)) - { - entry = REMOVE_HEAD_LIST(&netDevice->ReceivePacketList); - packet = CONTAINING_RECORD(entry, struct hv_netvsc_packet, ListEntry); + list_for_each_safe(pos, pos2, &netDevice->ReceivePacketList) { + packet = list_entry(&netDevice->ReceivePacketList, + struct hv_netvsc_packet, ListEntry); + list_del(&packet->ListEntry); kfree(packet); } @@ -913,8 +913,9 @@ NetVscOnDeviceRemove( { struct NETVSC_DEVICE *netDevice; struct hv_netvsc_packet *netvscPacket; + struct list_head *pos; + struct list_head *pos2; int ret=0; - LIST_ENTRY *entry; DPRINT_ENTER(NETVSC); @@ -952,11 +953,9 @@ NetVscOnDeviceRemove( Device->Driver->VmbusChannelInterface.Close(Device); /* Release all resources */ - while (!IsListEmpty(&netDevice->ReceivePacketList)) - { - entry = REMOVE_HEAD_LIST(&netDevice->ReceivePacketList); - netvscPacket = CONTAINING_RECORD(entry, struct hv_netvsc_packet, ListEntry); - + list_for_each_safe(pos, pos2, &netDevice->ReceivePacketList) { + netvscPacket = list_entry(pos, struct hv_netvsc_packet, ListEntry); + list_del(&netvscPacket->ListEntry); kfree(netvscPacket); } @@ -1116,12 +1115,11 @@ NetVscOnReceive( struct vmtransfer_page_packet_header *vmxferpagePacket; struct nvsp_message *nvspPacket; struct hv_netvsc_packet *netvscPacket=NULL; - LIST_ENTRY* entry; unsigned long start; unsigned long end, endVirtual; /* struct netvsc_driver *netvscDriver; */ struct xferpage_packet *xferpagePacket=NULL; - LIST_ENTRY listHead; + LIST_HEAD(listHead); int i=0, j=0; int count=0, bytesRemain=0; @@ -1168,8 +1166,6 @@ NetVscOnReceive( DPRINT_DBG(NETVSC, "xfer page - range count %d", vmxferpagePacket->RangeCount); - INITIALIZE_LIST_HEAD(&listHead); - /* * Grab free packets (range count + 1) to represent this xfer * page packet. +1 to represent the xfer page packet itself. @@ -1177,12 +1173,9 @@ NetVscOnReceive( * fulfil */ spin_lock_irqsave(&netDevice->receive_packet_list_lock, flags); - while (!IsListEmpty(&netDevice->ReceivePacketList)) + while (!list_empty(&netDevice->ReceivePacketList)) { - entry = REMOVE_HEAD_LIST(&netDevice->ReceivePacketList); - netvscPacket = CONTAINING_RECORD(entry, struct hv_netvsc_packet, ListEntry); - - INSERT_TAIL_LIST(&listHead, &netvscPacket->ListEntry); + list_move_tail(&netDevice->ReceivePacketList, &listHead); if (++count == vmxferpagePacket->RangeCount + 1) break; @@ -1202,10 +1195,7 @@ NetVscOnReceive( spin_lock_irqsave(&netDevice->receive_packet_list_lock, flags); for (i=count; i != 0; i--) { - entry = REMOVE_HEAD_LIST(&listHead); - netvscPacket = CONTAINING_RECORD(entry, struct hv_netvsc_packet, ListEntry); - - INSERT_TAIL_LIST(&netDevice->ReceivePacketList, &netvscPacket->ListEntry); + list_move_tail(&listHead, &netDevice->ReceivePacketList); } spin_unlock_irqrestore(&netDevice->receive_packet_list_lock, flags); @@ -1216,8 +1206,10 @@ NetVscOnReceive( } /* Remove the 1st packet to represent the xfer page packet itself */ - entry = REMOVE_HEAD_LIST(&listHead); - xferpagePacket = CONTAINING_RECORD(entry, struct xferpage_packet, ListEntry); + + xferpagePacket = list_entry(&listHead, struct xferpage_packet, ListEntry); + list_del(&xferpagePacket->ListEntry); + xferpagePacket->Count = count - 1; /* This is how much we can satisfy */ ASSERT(xferpagePacket->Count > 0 && xferpagePacket->Count <= vmxferpagePacket->RangeCount); @@ -1229,8 +1221,8 @@ NetVscOnReceive( /* Each range represents 1 RNDIS pkt that contains 1 ethernet frame */ for (i=0; i < (count - 1); i++) { - entry = REMOVE_HEAD_LIST(&listHead); - netvscPacket = CONTAINING_RECORD(entry, struct hv_netvsc_packet, ListEntry); + netvscPacket = list_entry(&listHead, struct hv_netvsc_packet, ListEntry); + list_del(&netvscPacket->ListEntry); /* Initialize the netvsc packet */ netvscPacket->XferPagePacket = xferpagePacket; @@ -1292,7 +1284,7 @@ NetVscOnReceive( NetVscOnReceiveCompletion(netvscPacket->Completion.Recv.ReceiveCompletionContext); } - ASSERT(IsListEmpty(&listHead)); + ASSERT(list_empty(&listHead)); PutNetDevice(Device); DPRINT_EXIT(NETVSC); @@ -1388,11 +1380,12 @@ NetVscOnReceiveCompletion( fSendReceiveComp = true; transactionId = packet->Completion.Recv.ReceiveCompletionTid; - INSERT_TAIL_LIST(&netDevice->ReceivePacketList, &packet->XferPagePacket->ListEntry); + list_add_tail(&packet->XferPagePacket->ListEntry, + &netDevice->ReceivePacketList); } /* Put the packet back */ - INSERT_TAIL_LIST(&netDevice->ReceivePacketList, &packet->ListEntry); + list_add_tail(&packet->ListEntry, &netDevice->ReceivePacketList); spin_unlock_irqrestore(&netDevice->receive_packet_list_lock, flags); /* Send a receive completion for the xfer page packet */ diff --git a/drivers/staging/hv/NetVsc.h b/drivers/staging/hv/NetVsc.h index 73de16e..08f4fa7 100644 --- a/drivers/staging/hv/NetVsc.h +++ b/drivers/staging/hv/NetVsc.h @@ -24,9 +24,9 @@ #ifndef _NETVSC_H_ #define _NETVSC_H_ +#include <linux/list.h> #include "VmbusPacketFormat.h" #include "VmbusChannelInterface.h" -#include "List.h" #include "NetVscApi.h" @@ -299,7 +299,7 @@ struct NETVSC_DEVICE { * List of free preallocated hv_netvsc_packet to represent receive * packet */ - LIST_ENTRY ReceivePacketList; + struct list_head ReceivePacketList; spinlock_t receive_packet_list_lock; /* Send buffer allocated by us but manages by NetVSP */ diff --git a/drivers/staging/hv/NetVscApi.h b/drivers/staging/hv/NetVscApi.h index c53e417..3284c1c 100644 --- a/drivers/staging/hv/NetVscApi.h +++ b/drivers/staging/hv/NetVscApi.h @@ -50,7 +50,7 @@ typedef void (*PFN_ON_LINKSTATUS_CHANGED)(struct hv_device *dev, u32 Status); /* Represent the xfer page packet which contains 1 or more netvsc packet */ struct xferpage_packet { - LIST_ENTRY ListEntry; + struct list_head ListEntry; /* # of netvsc packets this xfer packet contains */ u32 Count; @@ -65,7 +65,7 @@ struct xferpage_packet { */ struct hv_netvsc_packet { /* Bookkeeping stuff */ - LIST_ENTRY ListEntry; + struct list_head ListEntry; struct hv_device *Device; bool IsDataPacket; -- 1.6.2.5 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel