fw_send_request(device->card, &response->transaction,
request.tcode,
- device->node->node_id | LOCAL_BUS,
+ device->node->node_id,
device->card->generation,
device->node->max_speed,
request.offset,
offset = 0xfffff0000400ULL + index * 4;
fw_send_request(device->card, &t, TCODE_READ_QUADLET_REQUEST,
- device->node_id | LOCAL_BUS,
+ device->node_id,
device->generation, SCODE_100,
offset, NULL, 4, complete_transaction, &callback_data);
device->config_rom_retries++;
schedule_delayed_work(&device->work, RETRY_DELAY);
} else {
- fw_notify("giving up on config rom for node id %d\n",
+ fw_notify("giving up on config rom for node id %x\n",
device->node_id);
fw_device_release(&device->device);
}
{
struct fw_ohci *ohci = fw_ohci(card);
unsigned long flags;
- int retval = 0;
+ int n, retval = 0;
- /* FIXME: make sure this bitmask is cleared when we clear the
- * busReset interrupt bit. */
+ /* FIXME: Make sure this bitmask is cleared when we clear the busReset
+ * interrupt bit. Clear physReqResourceAllBuses on bus reset. */
spin_lock_irqsave(&ohci->lock, flags);
goto out;
}
- if (node_id < 32) {
- reg_write(ohci, OHCI1394_PhyReqFilterLoSet, 1 << node_id);
- } else {
- reg_write(ohci, OHCI1394_PhyReqFilterHiSet,
- 1 << (node_id - 32));
- }
+ /* NOTE, if the node ID contains a non-local bus ID, physical DMA is
+ * enabled for _all_ nodes on remote buses. */
+
+ n = (node_id & 0xffc0) == LOCAL_BUS ? node_id & 0x3f : 63;
+ if (n < 32)
+ reg_write(ohci, OHCI1394_PhyReqFilterLoSet, 1 << n);
+ else
+ reg_write(ohci, OHCI1394_PhyReqFilterHiSet, 1 << (n - 32));
+
flush_writes(ohci);
out:
spin_unlock_irqrestore(&ohci->lock, flags);
spin_unlock_irqrestore(&device->card->lock, flags);
fw_send_request(device->card, &orb->t, TCODE_WRITE_BLOCK_REQUEST,
- node_id | LOCAL_BUS, generation,
+ node_id, generation,
device->node->max_speed, offset,
&orb->pointer, sizeof orb->pointer,
complete_transaction, orb);
return -ENOMEM;
fw_send_request(device->card, t, TCODE_WRITE_QUADLET_REQUEST,
- sd->node_id | LOCAL_BUS, sd->generation, SCODE_400,
+ sd->node_id, sd->generation, SCODE_400,
sd->command_block_agent_address + SBP2_AGENT_RESET,
&zero, sizeof zero, complete_agent_reset_write, t);
sd->generation = generation;
sd->node_id = node_id;
- sd->address_high = (LOCAL_BUS | local_node_id) << 16;
+ sd->address_high = local_node_id << 16;
/* Get command block agent offset and login id. */
sd->command_block_agent_address =
sd->generation = generation;
sd->node_id = node_id;
- sd->address_high = (LOCAL_BUS | local_node_id) << 16;
+ sd->address_high = local_node_id << 16;
}
static void sbp2_update(struct fw_unit *unit)
return NULL;
node->color = color;
- node->node_id = self_id_phy_id(sid);
+ node->node_id = LOCAL_BUS | self_id_phy_id(sid);
node->link_on = self_id_link_on(sid);
node->phy_speed = self_id_phy_speed(sid);
node->port_count = port_count;
#define header_get_extended_tcode(q) (((q) >> 0) & 0xffff)
#define phy_config_gap_count(gap_count) (((gap_count) << 16) | (1 << 22))
-#define phy_config_root_id(node_id) (((node_id) << 24) | (1 << 23))
+#define phy_config_root_id(node_id) ((((node_id) & 0x3f) << 24) | (1 << 23))
#define phy_identifier(id) ((id) << 30)
static void
header_retry(RETRY_X) |
header_tlabel(tlabel) |
header_tcode(tcode) |
- header_destination(node_id | LOCAL_BUS);
+ header_destination(node_id);
packet->header[1] =
header_offset_high(offset >> 32) | header_source(0);
packet->header[2] =
* @param tcode the tcode for this transaction. Do not use
* TCODE_LOCK_REQUEST directly, insted use TCODE_LOCK_MASK_SWAP
* etc. to specify tcode and ext_tcode.
- * @param node_id the node_id of the destination node
+ * @param node_id the destination node ID (bus ID and PHY ID concatenated)
* @param generation the generation for which node_id is valid
* @param speed the speed to use for sending the request
* @param offset the 48 bit offset on the destination node