dma_addr_t phys_buffer[RIO_MAX_TX_RING_SIZE];
int tx_slot;
int size;
+ void *dev_id;
} msg_tx_ring;
static struct rio_msg_rx_ring {
void *virt_buffer[RIO_MAX_RX_RING_SIZE];
int rx_slot;
int size;
+ void *dev_id;
} msg_rx_ring;
/**
if (osr & RIO_MSG_OSR_EOMI) {
u32 dqp = in_be32((void *)&msg_regs->odqdpar);
int slot = (dqp - msg_tx_ring.phys) >> 5;
- port->outb_msg[0].mcback(port, -1, slot);
+ port->outb_msg[0].mcback(port, msg_tx_ring.dev_id, -1, slot);
/* Ack the end-of-message interrupt */
out_be32((void *)&msg_regs->osr, RIO_MSG_OSR_EOMI);
/**
* rio_open_outb_mbox - Initialize MPC85xx outbound mailbox
* @mport: Master port implementing the outbound message unit
+ * @dev_id: Device specific pointer to pass on event
* @mbox: Mailbox to open
* @entries: Number of entries in the outbound mailbox ring
*
* and enables the outbound message unit. Returns %0 on success and
* %-EINVAL or %-ENOMEM on failure.
*/
-int rio_open_outb_mbox(struct rio_mport *mport, int mbox, int entries)
+int rio_open_outb_mbox(struct rio_mport *mport, void *dev_id, int mbox, int entries)
{
int i, j, rc = 0;
}
/* Initialize shadow copy ring */
+ msg_tx_ring.dev_id = dev_id;
msg_tx_ring.size = entries;
for (i = 0; i < msg_tx_ring.size; i++) {
* make the callback with an unknown/invalid mailbox number
* argument.
*/
- port->inb_msg[0].mcback(port, -1, -1);
+ port->inb_msg[0].mcback(port, msg_rx_ring.dev_id, -1, -1);
/* Ack the queueing interrupt */
out_be32((void *)&msg_regs->isr, RIO_MSG_ISR_DIQI);
/**
* rio_open_inb_mbox - Initialize MPC85xx inbound mailbox
* @mport: Master port implementing the inbound message unit
+ * @dev_id: Device specific pointer to pass on event
* @mbox: Mailbox to open
* @entries: Number of entries in the inbound mailbox ring
*
* and enables the inbound message unit. Returns %0 on success
* and %-EINVAL or %-ENOMEM on failure.
*/
-int rio_open_inb_mbox(struct rio_mport *mport, int mbox, int entries)
+int rio_open_inb_mbox(struct rio_mport *mport, void *dev_id, int mbox, int entries)
{
int i, rc = 0;
}
/* Initialize client buffer ring */
+ msg_rx_ring.dev_id = dev_id;
msg_rx_ring.size = entries;
msg_rx_ring.rx_slot = 0;
for (i = 0; i < msg_rx_ring.size; i++)
}
}
if (found) {
- dbell->dinb(port, DBELL_SID(dmsg), DBELL_TID(dmsg),
+ dbell->dinb(port, dbell->dev_id, DBELL_SID(dmsg), DBELL_TID(dmsg),
DBELL_INF(dmsg));
} else {
pr_debug
/* Sysfs support */
#define rio_config_attr(field, format_string) \
static ssize_t \
- field##_show(struct device *dev, char *buf) \
+field##_show(struct device *dev, struct device_attribute *attr, char *buf) \
{ \
struct rio_dev *rdev = to_rio_dev(dev); \
\
rio_config_attr(asm_vid, "0x%04x\n");
rio_config_attr(asm_rev, "0x%04x\n");
-static ssize_t routes_show(struct device *dev, char *buf)
+static ssize_t routes_show(struct device *dev, struct device_attribute *attr, char *buf)
{
struct rio_dev *rdev = to_rio_dev(dev);
char *str = buf;
/**
* rio_request_inb_mbox - request inbound mailbox service
* @mport: RIO master port from which to allocate the mailbox resource
+ * @dev_id: Device specific pointer to pass on event
* @mbox: Mailbox number to claim
* @entries: Number of entries in inbound mailbox queue
* @minb: Callback to execute when inbound message is received
* a callback function to the resource. Returns %0 on success.
*/
int rio_request_inb_mbox(struct rio_mport *mport,
+ void *dev_id,
int mbox,
int entries,
- void (*minb) (struct rio_mport * mport, int mbox,
+ void (*minb) (struct rio_mport * mport, void *dev_id, int mbox,
int slot))
{
int rc = 0;
/* Hook the inbound message callback */
mport->inb_msg[mbox].mcback = minb;
- rc = rio_open_inb_mbox(mport, mbox, entries);
+ rc = rio_open_inb_mbox(mport, dev_id, mbox, entries);
} else
rc = -ENOMEM;
/**
* rio_request_outb_mbox - request outbound mailbox service
* @mport: RIO master port from which to allocate the mailbox resource
+ * @dev_id: Device specific pointer to pass on event
* @mbox: Mailbox number to claim
* @entries: Number of entries in outbound mailbox queue
* @moutb: Callback to execute when outbound message is sent
* a callback function to the resource. Returns 0 on success.
*/
int rio_request_outb_mbox(struct rio_mport *mport,
+ void *dev_id,
int mbox,
int entries,
- void (*moutb) (struct rio_mport * mport, int mbox,
- int slot))
+ void (*moutb) (struct rio_mport * mport, void *dev_id, int mbox, int slot))
{
int rc = 0;
/* Hook the inbound message callback */
mport->outb_msg[mbox].mcback = moutb;
- rc = rio_open_outb_mbox(mport, mbox, entries);
+ rc = rio_open_outb_mbox(mport, dev_id, mbox, entries);
} else
rc = -ENOMEM;
/**
* rio_setup_inb_dbell - bind inbound doorbell callback
* @mport: RIO master port to bind the doorbell callback
+ * @dev_id: Device specific pointer to pass on event
* @res: Doorbell message resource
* @dinb: Callback to execute when doorbell is received
*
* satisfied.
*/
static int
-rio_setup_inb_dbell(struct rio_mport *mport, struct resource *res,
- void (*dinb) (struct rio_mport * mport, u16 src, u16 dst,
+rio_setup_inb_dbell(struct rio_mport *mport, void *dev_id, struct resource *res,
+ void (*dinb) (struct rio_mport * mport, void *dev_id, u16 src, u16 dst,
u16 info))
{
int rc = 0;
dbell->res = res;
dbell->dinb = dinb;
+ dbell->dev_id = dev_id;
list_add_tail(&dbell->node, &mport->dbells);
/**
* rio_request_inb_dbell - request inbound doorbell message service
* @mport: RIO master port from which to allocate the doorbell resource
+ * @dev_id: Device specific pointer to pass on event
* @start: Doorbell info range start
* @end: Doorbell info range end
* @dinb: Callback to execute when doorbell is received
* has been satisfied.
*/
int rio_request_inb_dbell(struct rio_mport *mport,
+ void *dev_id,
u16 start,
u16 end,
- void (*dinb) (struct rio_mport * mport, u16 src,
+ void (*dinb) (struct rio_mport * mport, void *dev_id, u16 src,
u16 dst, u16 info))
{
int rc = 0;
}
/* Hook the doorbell callback */
- rc = rio_setup_inb_dbell(mport, res, dinb);
+ rc = rio_setup_inb_dbell(mport, dev_id, res, dinb);
} else
rc = -ENOMEM;
*/
struct rio_msg {
struct resource *res;
- void (*mcback) (struct rio_mport * mport, int mbox, int slot);
+ void (*mcback) (struct rio_mport * mport, void *dev_id, int mbox, int slot);
};
/**
* @node: Node in list of doorbell events
* @res: Doorbell resource
* @dinb: Doorbell event callback
+ * @dev_id: Device specific pointer to pass on event
*/
struct rio_dbell {
struct list_head node;
struct resource *res;
- void (*dinb) (struct rio_mport * mport, u16 src, u16 dst, u16 info);
+ void (*dinb) (struct rio_mport *mport, void *dev_id, u16 src, u16 dst, u16 info);
+ void *dev_id;
};
/**
void *, size_t);
extern int rio_hw_add_inb_buffer(struct rio_mport *, int, void *);
extern void *rio_hw_get_inb_message(struct rio_mport *, int);
-extern int rio_open_inb_mbox(struct rio_mport *, int, int);
+extern int rio_open_inb_mbox(struct rio_mport *, void *, int, int);
extern void rio_close_inb_mbox(struct rio_mport *, int);
-extern int rio_open_outb_mbox(struct rio_mport *, int, int);
+extern int rio_open_outb_mbox(struct rio_mport *, void *, int, int);
extern void rio_close_outb_mbox(struct rio_mport *, int);
#endif /* __KERNEL__ */
.asm_did = RIO_ANY_ID, .asm_vid = RIO_ANY_ID
/* Mailbox management */
-extern int rio_request_outb_mbox(struct rio_mport *, int, int,
- void (*)(struct rio_mport *, int, int));
+extern int rio_request_outb_mbox(struct rio_mport *, void *, int, int,
+ void (*)(struct rio_mport *, void *,int, int));
extern int rio_release_outb_mbox(struct rio_mport *, int);
/**
return rio_hw_add_outb_message(mport, rdev, mbox, buffer, len);
}
-extern int rio_request_inb_mbox(struct rio_mport *, int, int,
- void (*)(struct rio_mport *, int, int));
+extern int rio_request_inb_mbox(struct rio_mport *, void *, int, int,
+ void (*)(struct rio_mport *, void *, int, int));
extern int rio_release_inb_mbox(struct rio_mport *, int);
/**
}
/* Doorbell management */
-extern int rio_request_inb_dbell(struct rio_mport *, u16, u16,
- void (*)(struct rio_mport *, u16, u16, u16));
+extern int rio_request_inb_dbell(struct rio_mport *, void *, u16, u16,
+ void (*)(struct rio_mport *, void *, u16, u16, u16));
extern int rio_release_inb_dbell(struct rio_mport *, u16, u16);
extern struct resource *rio_request_outb_dbell(struct rio_dev *, u16, u16);
extern int rio_release_outb_dbell(struct rio_dev *, struct resource *);