* Place - Suite 330, Boston, MA 02111-1307 USA.
*
* Authors:
+ * Haiyang Zhang <haiyangz@microsoft.com>
* Hank Janssen <hjanssen@microsoft.com>
*/
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/delay.h>
#include <linux/io.h>
+#include <linux/slab.h>
#include "osd.h"
#include "logging.h"
#include "NetVsc.h"
static int NetVscInitializeReceiveBufferWithNetVsp(struct hv_device *Device);
-static int NetVscDestroySendBuffer(struct NETVSC_DEVICE *NetDevice);
+static int NetVscDestroySendBuffer(struct netvsc_device *NetDevice);
-static int NetVscDestroyReceiveBuffer(struct NETVSC_DEVICE *NetDevice);
+static int NetVscDestroyReceiveBuffer(struct netvsc_device *NetDevice);
static int NetVscConnectToVsp(struct hv_device *Device);
u64 TransactionId);
-static struct NETVSC_DEVICE *AllocNetDevice(struct hv_device *Device)
+static struct netvsc_device *AllocNetDevice(struct hv_device *Device)
{
- struct NETVSC_DEVICE *netDevice;
+ struct netvsc_device *netDevice;
- netDevice = kzalloc(sizeof(struct NETVSC_DEVICE), GFP_KERNEL);
+ netDevice = kzalloc(sizeof(struct netvsc_device), GFP_KERNEL);
if (!netDevice)
return NULL;
return netDevice;
}
-static void FreeNetDevice(struct NETVSC_DEVICE *Device)
+static void FreeNetDevice(struct netvsc_device *Device)
{
ASSERT(atomic_read(&Device->RefCount) == 0);
Device->Device->Extension = NULL;
/* Get the net device object iff exists and its refcount > 1 */
-static struct NETVSC_DEVICE *GetOutboundNetDevice(struct hv_device *Device)
+static struct netvsc_device *GetOutboundNetDevice(struct hv_device *Device)
{
- struct NETVSC_DEVICE *netDevice;
+ struct netvsc_device *netDevice;
netDevice = Device->Extension;
if (netDevice && atomic_read(&netDevice->RefCount) > 1)
}
/* Get the net device object iff exists and its refcount > 0 */
-static struct NETVSC_DEVICE *GetInboundNetDevice(struct hv_device *Device)
+static struct netvsc_device *GetInboundNetDevice(struct hv_device *Device)
{
- struct NETVSC_DEVICE *netDevice;
+ struct netvsc_device *netDevice;
netDevice = Device->Extension;
if (netDevice && atomic_read(&netDevice->RefCount))
static void PutNetDevice(struct hv_device *Device)
{
- struct NETVSC_DEVICE *netDevice;
+ struct netvsc_device *netDevice;
netDevice = Device->Extension;
ASSERT(netDevice);
atomic_dec(&netDevice->RefCount);
}
-static struct NETVSC_DEVICE *ReleaseOutboundNetDevice(struct hv_device *Device)
+static struct netvsc_device *ReleaseOutboundNetDevice(struct hv_device *Device)
{
- struct NETVSC_DEVICE *netDevice;
+ struct netvsc_device *netDevice;
netDevice = Device->Extension;
if (netDevice == NULL)
return netDevice;
}
-static struct NETVSC_DEVICE *ReleaseInboundNetDevice(struct hv_device *Device)
+static struct netvsc_device *ReleaseInboundNetDevice(struct hv_device *Device)
{
- struct NETVSC_DEVICE *netDevice;
+ struct netvsc_device *netDevice;
netDevice = Device->Extension;
if (netDevice == NULL)
static int NetVscInitializeReceiveBufferWithNetVsp(struct hv_device *Device)
{
int ret = 0;
- struct NETVSC_DEVICE *netDevice;
+ struct netvsc_device *netDevice;
struct nvsp_message *initPacket;
DPRINT_ENTER(NETVSC);
static int NetVscInitializeSendBufferWithNetVsp(struct hv_device *Device)
{
int ret = 0;
- struct NETVSC_DEVICE *netDevice;
+ struct netvsc_device *netDevice;
struct nvsp_message *initPacket;
DPRINT_ENTER(NETVSC);
return ret;
}
-static int NetVscDestroyReceiveBuffer(struct NETVSC_DEVICE *NetDevice)
+static int NetVscDestroyReceiveBuffer(struct netvsc_device *NetDevice)
{
struct nvsp_message *revokePacket;
int ret = 0;
return ret;
}
-static int NetVscDestroySendBuffer(struct NETVSC_DEVICE *NetDevice)
+static int NetVscDestroySendBuffer(struct netvsc_device *NetDevice)
{
struct nvsp_message *revokePacket;
int ret = 0;
static int NetVscConnectToVsp(struct hv_device *Device)
{
int ret;
- struct NETVSC_DEVICE *netDevice;
+ struct netvsc_device *netDevice;
struct nvsp_message *initPacket;
int ndisVersion;
return ret;
}
-static void NetVscDisconnectFromVsp(struct NETVSC_DEVICE *NetDevice)
+static void NetVscDisconnectFromVsp(struct netvsc_device *NetDevice)
{
DPRINT_ENTER(NETVSC);
{
int ret = 0;
int i;
- struct NETVSC_DEVICE *netDevice;
- struct hv_netvsc_packet *packet;
- LIST_ENTRY *entry;
+ struct netvsc_device *netDevice;
+ struct hv_netvsc_packet *packet, *pos;
struct netvsc_driver *netDriver =
(struct netvsc_driver *)Device->Driver;
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++) {
packet = kzalloc(sizeof(struct hv_netvsc_packet) +
NETVSC_RECEIVE_PACKETLIST_COUNT, i);
break;
}
-
- INSERT_TAIL_LIST(&netDevice->ReceivePacketList,
- &packet->ListEntry);
+ list_add_tail(&packet->ListEntry,
+ &netDevice->ReceivePacketList);
}
netDevice->ChannelInitEvent = osd_WaitEventCreate();
if (netDevice) {
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_entry_safe(packet, pos,
+ &netDevice->ReceivePacketList,
+ ListEntry) {
+ list_del(&packet->ListEntry);
kfree(packet);
}
*/
static int NetVscOnDeviceRemove(struct hv_device *Device)
{
- struct NETVSC_DEVICE *netDevice;
- struct hv_netvsc_packet *netvscPacket;
- LIST_ENTRY *entry;
+ struct netvsc_device *netDevice;
+ struct hv_netvsc_packet *netvscPacket, *pos;
DPRINT_ENTER(NETVSC);
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_entry_safe(netvscPacket, pos,
+ &netDevice->ReceivePacketList, ListEntry) {
+ list_del(&netvscPacket->ListEntry);
kfree(netvscPacket);
}
static void NetVscOnSendCompletion(struct hv_device *Device,
struct vmpacket_descriptor *Packet)
{
- struct NETVSC_DEVICE *netDevice;
+ struct netvsc_device *netDevice;
struct nvsp_message *nvspPacket;
struct hv_netvsc_packet *nvscPacket;
static int NetVscOnSend(struct hv_device *Device,
struct hv_netvsc_packet *Packet)
{
- struct NETVSC_DEVICE *netDevice;
+ struct netvsc_device *netDevice;
int ret = 0;
struct nvsp_message sendMessage;
static void NetVscOnReceive(struct hv_device *Device,
struct vmpacket_descriptor *Packet)
{
- struct NETVSC_DEVICE *netDevice;
+ struct netvsc_device *netDevice;
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;
int i, j;
int count = 0, bytesRemain = 0;
unsigned long flags;
+ LIST_HEAD(listHead);
DPRINT_ENTER(NETVSC);
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.
* fulfil
*/
spin_lock_irqsave(&netDevice->receive_packet_list_lock, flags);
- while (!IsListEmpty(&netDevice->ReceivePacketList)) {
- entry = REMOVE_HEAD_LIST(&netDevice->ReceivePacketList);
- netvscPacket = CONTAINING_RECORD(entry,
- struct hv_netvsc_packet,
- ListEntry);
-
- INSERT_TAIL_LIST(&listHead, &netvscPacket->ListEntry);
-
+ while (!list_empty(&netDevice->ReceivePacketList)) {
+ list_move_tail(netDevice->ReceivePacketList.next, &listHead);
if (++count == vmxferpagePacket->RangeCount + 1)
break;
}
/* Return it to the freelist */
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.next,
+ &netDevice->ReceivePacketList);
}
spin_unlock_irqrestore(&netDevice->receive_packet_list_lock,
flags);
}
/* 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 = (struct xferpage_packet*)listHead.next;
+ list_del(&xferpagePacket->ListEntry);
+
/* This is how much we can satisfy */
xferpagePacket->Count = count - 1;
ASSERT(xferpagePacket->Count > 0 && xferpagePacket->Count <=
/* 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 = (struct hv_netvsc_packet*)listHead.next;
+ list_del(&netvscPacket->ListEntry);
/* Initialize the netvsc packet */
netvscPacket->XferPagePacket = xferpagePacket;
NetVscOnReceiveCompletion(netvscPacket->Completion.Recv.ReceiveCompletionContext);
}
- ASSERT(IsListEmpty(&listHead));
+ ASSERT(list_empty(&listHead));
PutNetDevice(Device);
DPRINT_EXIT(NETVSC);
{
struct hv_netvsc_packet *packet = Context;
struct hv_device *device = (struct hv_device *)packet->Device;
- struct NETVSC_DEVICE *netDevice;
+ struct netvsc_device *netDevice;
u64 transactionId = 0;
bool fSendReceiveComp = false;
unsigned long flags;
if (packet->XferPagePacket->Count == 0) {
fSendReceiveComp = true;
transactionId = packet->Completion.Recv.ReceiveCompletionTid;
+ list_add_tail(&packet->XferPagePacket->ListEntry,
+ &netDevice->ReceivePacketList);
- INSERT_TAIL_LIST(&netDevice->ReceivePacketList,
- &packet->XferPagePacket->ListEntry);
}
/* 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 */
const int netPacketSize = 2048;
int ret;
struct hv_device *device = Context;
- struct NETVSC_DEVICE *netDevice;
+ struct netvsc_device *netDevice;
u32 bytesRecvd;
u64 requestId;
unsigned char packet[netPacketSize];