static void __cpdma_chan_submit(struct cpdma_chan *chan, struct cpdma_desc __iomem *desc) { struct cpdma_ctlr *ctlr = chan->ctlr; struct cpdma_desc __iomem *prev = chan->tail; struct cpdma_desc_pool *pool = ctlr->pool; dma_addr_t desc_dma; u32 mode; desc_dma = desc_phys(pool, desc); /* simple case - idle channel */ if (!chan->head) { chan->stats.head_enqueue++; chan->head = desc; chan->tail = desc; if (chan->state == CPDMA_STATE_ACTIVE) chan_write(chan, hdp, desc_dma); return; } /* first chain the descriptor at the tail of the list */ desc_write(prev, hw_next, desc_dma); chan->tail = desc; chan->stats.tail_enqueue++; /* next check if EOQ has been triggered already */ mode = desc_read(prev, hw_mode); if (((mode & (CPDMA_DESC_EOQ | CPDMA_DESC_OWNER)) == CPDMA_DESC_EOQ) && (chan->state == CPDMA_STATE_ACTIVE)) { desc_write(prev, hw_mode, mode & ~CPDMA_DESC_EOQ); chan_write(chan, hdp, desc_dma); chan->stats.misqueued++; } }
int cpdma_chan_submit(struct cpdma_chan *chan, void *token, void *data, int len, gfp_t gfp_mask) { struct cpdma_ctlr *ctlr = chan->ctlr; struct cpdma_desc __iomem *desc; dma_addr_t buffer; unsigned long flags; u32 mode; int ret = 0; bool is_rx; spin_lock_irqsave(&chan->lock, flags); if (chan->state == CPDMA_STATE_TEARDOWN) { ret = -EINVAL; goto unlock_ret; } is_rx = (chan->rxfree != 0); desc = cpdma_desc_alloc(ctlr->pool, 1, is_rx); if (!desc) { chan->stats.desc_alloc_fail++; ret = -ENOMEM; goto unlock_ret; } if (len < ctlr->params.min_packet_size) { len = ctlr->params.min_packet_size; chan->stats.runt_transmit_buff++; } buffer = dma_map_single(ctlr->dev, data, len, chan->dir); mode = CPDMA_DESC_OWNER | CPDMA_DESC_SOP | CPDMA_DESC_EOP; desc_write(desc, hw_next, 0); desc_write(desc, sw_next, 0); desc_write(desc, hw_buffer, buffer); desc_write(desc, hw_len, len); desc_write(desc, hw_mode, mode | len); desc_write(desc, sw_token, token); desc_write(desc, sw_buffer, buffer); desc_write(desc, sw_len, len); __cpdma_chan_submit(chan, desc); if (chan->state == CPDMA_STATE_ACTIVE && chan->rxfree) chan_write(chan, rxfree, 1); chan->count++; unlock_ret: spin_unlock_irqrestore(&chan->lock, flags); return ret; }
static DBusMessage *desc_write_value(DBusConnection *conn, DBusMessage *msg, void *user_data) { struct descriptor *desc = user_data; DBusMessageIter iter; dbus_message_iter_init(msg, &iter); desc_write(desc, &iter); return dbus_message_new_method_return(msg); }
static void desc_set_value(const GDBusPropertyTable *property, DBusMessageIter *iter, GDBusPendingPropertySet id, void *user_data) { struct descriptor *desc = user_data; printf("Descriptor(%s): Set(\"Value\", ...)\n", desc->uuid); desc_write(desc, iter); g_dbus_pending_property_success(id); }
static bool __desc_ring_post_desc(DescRing *ring, int err) { uint16_t comp_err = 0x8000 | (uint16_t)-err; DescInfo *info = &ring->info[ring->tail]; info->desc.comp_err = cpu_to_le16(comp_err); desc_write(ring, ring->tail); ring->tail = (ring->tail + 1) % ring->size; /* return true if starting credit count */ return ring->credits++ == 0; }
GtkWidget * create_dspdesc_window(ggobid *gg, PluginInstance *inst) { GtkWidget *window, *hb, *label, *entry; GtkTooltips *tips = gtk_tooltips_new (); dspdescd *desc = dspdescFromInst (inst); window = gtk_file_chooser_dialog_new("Save display description", NULL, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, GTK_STOCK_CLOSE, GTK_RESPONSE_REJECT, NULL); desc->window = window; /* label and entry widget for main title */ hb = gtk_hbox_new (false, 1); label = gtk_label_new_with_mnemonic ("Figure _title: "); gtk_box_pack_start (GTK_BOX (hb), label, false, false, 2); entry = gtk_entry_new (); gtk_label_set_mnemonic_widget(GTK_LABEL(label), entry); g_object_set_data(G_OBJECT(window), "TITLE", entry); gtk_tooltips_set_tip (GTK_TOOLTIPS (tips), entry, "Type in the figure title", NULL); gtk_box_pack_start (GTK_BOX (hb), entry, true, true, 2); gtk_widget_show_all(hb); gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(window), hb); if (gtk_dialog_run(GTK_DIALOG(window)) == GTK_RESPONSE_ACCEPT) desc_write(inst); plugin_destroy(inst); return(window); }