Can now both send and receive packets. LL header format not yet
fixed; still using a quick hack-up just to be able to pass through data.
This commit is contained in:
parent
03c90e183f
commit
30a19c3f1c
|
@ -1587,12 +1587,14 @@ static void prep_send_wqe_buf(void *qph,
|
||||||
}
|
}
|
||||||
snd_wqe->mpointer[0].byte_count = cpu_to_be32(len);
|
snd_wqe->mpointer[0].byte_count = cpu_to_be32(len);
|
||||||
|
|
||||||
|
#if 0
|
||||||
DBG ( "prep_send_wqe_buf()\n" );
|
DBG ( "prep_send_wqe_buf()\n" );
|
||||||
DBG ( "snd_wqe:\n" );
|
DBG ( "snd_wqe:\n" );
|
||||||
DBG_HD ( snd_wqe, sizeof ( *snd_wqe ) );
|
DBG_HD ( snd_wqe, sizeof ( *snd_wqe ) );
|
||||||
DBG ( "packet:\n" );
|
DBG ( "packet:\n" );
|
||||||
DBG_HD ( bus_to_virt(be32_to_cpu(snd_wqe->mpointer[0].local_addr_l)),
|
DBG_HD ( bus_to_virt(be32_to_cpu(snd_wqe->mpointer[0].local_addr_l)),
|
||||||
len );
|
len );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *alloc_ud_av(void)
|
static void *alloc_ud_av(void)
|
||||||
|
|
|
@ -248,13 +248,13 @@ static void mlx_poll ( struct net_device *netdev ) {
|
||||||
}
|
}
|
||||||
buf = get_rcv_wqe_buf(ib_cqe.wqe, 1);
|
buf = get_rcv_wqe_buf(ib_cqe.wqe, 1);
|
||||||
memcpy ( iob_put ( iobuf, len ), buf, len );
|
memcpy ( iob_put ( iobuf, len ), buf, len );
|
||||||
DBG ( "Received packet header:\n" );
|
// DBG ( "Received packet header:\n" );
|
||||||
struct recv_wqe_st *rcv_wqe = ib_cqe.wqe;
|
// struct recv_wqe_st *rcv_wqe = ib_cqe.wqe;
|
||||||
DBG_HD ( get_rcv_wqe_buf(ib_cqe.wqe, 0),
|
// DBG_HD ( get_rcv_wqe_buf(ib_cqe.wqe, 0),
|
||||||
be32_to_cpu(rcv_wqe->mpointer[0].byte_count) );
|
// be32_to_cpu(rcv_wqe->mpointer[0].byte_count) );
|
||||||
|
|
||||||
DBG ( "Received packet:\n" );
|
// DBG ( "Received packet:\n" );
|
||||||
DBG_HD ( iobuf->data, iob_len ( iobuf ) );
|
// DBG_HD ( iobuf->data, iob_len ( iobuf ) );
|
||||||
|
|
||||||
netdev_rx ( netdev, iobuf );
|
netdev_rx ( netdev, iobuf );
|
||||||
|
|
||||||
|
@ -392,6 +392,7 @@ static int mlx_probe ( struct pci_device *pci,
|
||||||
const struct pci_device_id *id __unused ) {
|
const struct pci_device_id *id __unused ) {
|
||||||
struct net_device *netdev;
|
struct net_device *netdev;
|
||||||
struct mlx_nic *mlx;
|
struct mlx_nic *mlx;
|
||||||
|
struct ib_mac *mac;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
/* Allocate net device */
|
/* Allocate net device */
|
||||||
|
@ -410,7 +411,9 @@ static int mlx_probe ( struct pci_device *pci,
|
||||||
/* Initialise hardware */
|
/* Initialise hardware */
|
||||||
if ( ( rc = ipoib_init ( pci ) ) != 0 )
|
if ( ( rc = ipoib_init ( pci ) ) != 0 )
|
||||||
goto err_ipoib_init;
|
goto err_ipoib_init;
|
||||||
memcpy ( netdev->ll_addr, ipoib_data.port_gid_raw, IB_ALEN );
|
mac = ( ( struct ib_mac * ) netdev->ll_addr );
|
||||||
|
mac->qpn = htonl ( ipoib_data.ipoib_qpn );
|
||||||
|
memcpy ( &mac->gid, ipoib_data.port_gid_raw, sizeof ( mac->gid ) );
|
||||||
|
|
||||||
/* Register network device */
|
/* Register network device */
|
||||||
if ( ( rc = register_netdev ( netdev ) ) != 0 )
|
if ( ( rc = register_netdev ( netdev ) ) != 0 )
|
||||||
|
|
|
@ -14,6 +14,43 @@
|
||||||
#define IB_ALEN 20
|
#define IB_ALEN 20
|
||||||
#define IB_HLEN 24
|
#define IB_HLEN 24
|
||||||
|
|
||||||
|
/** An Infiniband Global Identifier */
|
||||||
|
struct ib_gid {
|
||||||
|
uint8_t bytes[16];
|
||||||
|
};
|
||||||
|
|
||||||
|
/** An Infiniband Global Route Header */
|
||||||
|
struct ib_global_route_header {
|
||||||
|
/** IP version, traffic class, and flow label
|
||||||
|
*
|
||||||
|
* 4 bits : Version of the GRH
|
||||||
|
* 8 bits : Traffic class
|
||||||
|
* 20 bits : Flow label
|
||||||
|
*/
|
||||||
|
uint32_t ipver_tclass_flowlabel;
|
||||||
|
/** Payload length */
|
||||||
|
uint16_t paylen;
|
||||||
|
/** Next header */
|
||||||
|
uint8_t nxthdr;
|
||||||
|
/** Hop limit */
|
||||||
|
uint8_t hoplmt;
|
||||||
|
/** Source GID */
|
||||||
|
struct ib_gid sgid;
|
||||||
|
/** Destiniation GID */
|
||||||
|
struct ib_gid dgid;
|
||||||
|
} __attribute__ (( packed ));
|
||||||
|
|
||||||
|
/** An Infiniband MAC address */
|
||||||
|
struct ib_mac {
|
||||||
|
/** Queue pair number
|
||||||
|
*
|
||||||
|
* MSB must be zero; QPNs are only 24-bit.
|
||||||
|
*/
|
||||||
|
uint32_t qpn;
|
||||||
|
/** Port GID */
|
||||||
|
struct ib_gid gid;
|
||||||
|
} __attribute__ (( packed ));
|
||||||
|
|
||||||
/** An Infiniband header
|
/** An Infiniband header
|
||||||
*
|
*
|
||||||
* This data structure doesn't represent the on-wire format, but does
|
* This data structure doesn't represent the on-wire format, but does
|
||||||
|
|
|
@ -70,6 +70,17 @@ static int ib_tx ( struct io_buffer *iobuf, struct net_device *netdev,
|
||||||
* network-layer protocol.
|
* network-layer protocol.
|
||||||
*/
|
*/
|
||||||
static int ib_rx ( struct io_buffer *iobuf, struct net_device *netdev ) {
|
static int ib_rx ( struct io_buffer *iobuf, struct net_device *netdev ) {
|
||||||
|
|
||||||
|
struct {
|
||||||
|
uint16_t proto;
|
||||||
|
uint16_t reserved;
|
||||||
|
} * header = iobuf->data;
|
||||||
|
|
||||||
|
iob_pull ( iobuf, sizeof ( *header ) );
|
||||||
|
return net_rx ( iobuf, netdev, header->proto, NULL );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct ibhdr *ibhdr = iobuf->data;
|
struct ibhdr *ibhdr = iobuf->data;
|
||||||
|
|
||||||
/* Sanity check */
|
/* Sanity check */
|
||||||
|
|
Reference in New Issue