How to send a signal to a PCI card? - memory

A PCI card can have some memory associated with it (either mapped to memory space or mapped to IO space).
Now say we have a PCI Ethernet card (and it is using memory-mapped IO), the Ethernet card will have some memory as a buffer to put data to send down the wire in, and whenever the Ethernet driver wants to send the data down the wire, it can ask the Ethernet card to do that.
Now I assume that a part of the mapped memory for the Ethernet card is a "command register", and when you write for example the string "send it" to this command register, the Ethernet card will send the buffer down the wire.
Now my question is, how does the Ethernet card knows that the memory for the control register has been written to? does the Ethernet card polls the memory content for the control register, or is there some mechanism that is used to send a signal automatically to the Ethernet card whenever the memory address for the control register is written to (so kind of like an interrupt, but in the opposite direction)?

The address range of memory-mapped IO for a PCI card is controlled by the Base Address Registers (BARs) of the PCI device. When the CPU accesses a memory address within the range of a BAR, the memory access is routed directly to the device (along with the data, if it is a write operation), instead of being routed to memory. When the PCI device receives the memory access it immediately updates the designated control register. If the MMIO access is a read operation, the device responds to the CPU with the appropriate value.

MMIO lets you use load and store instructions instead of IN and OUT instructions, but the device still sees commands, not just memory accesses.
That's why it's MMIO, not just memory-mapped device memory.

Related

Disable PCIe device asserting unknown interrupt

I'm currently working on a PCIe-based Intel network card driver for my OS development project. While the driver seems to be working well, as soon as I enable INTA (IRQ 16, using the I/O APIC) I keep getting a flood of interrupts which completely blocks my kernel. These are not caused by the network card (Interrupt Cause Register is all zeroes), except in very few cases where the card actually received a packet.
Things I have tried:
Test other IRQ trigger settings - level-triggered on "low" should be correct, since in other cases nothing happens at all (network card interrupts should work).
Disable all other PCIe devices: I tried writing 0x0400 into each device's PCIe cfg space command register (set the interrupt disable flag, clear all other flags); I only excluded the network card, the video card and bridge devices. Although that operation succeeds, I am not entirely sure that this really disables the given devices, since those interrupts still occur.
Is writing 0x0400 to the command register the proper way to completely disable a PCIe device?

Use device serial number instead of PID in HL7?

We are developing a medical device which shall be connected to a Patient Data Management Systems (PDMS). The idea is to use HL7 messages to push measured data directly to the PDMS.
The device itself is too small to fit a convenient user interface to input the patient id. Is it possible in HL7 to transmit just the device serial number instead of the PID and let the PDMS make the connection between the device and the patient?
The device serial number should be in the PRT-10 field, not the PID segment.

How to get the paired BLE device count?

Description - How I can get the number of BLE connection in iOS.
I want to restrict a user to add more BLE sensor after a particular number of BLE connection. I want to get the number of a BLE connection a device can handle.
A connection represents state, not traffic. The count of connections will be bound by either memory or the data structures used by the Bluetooth stack to manage them, both unknown. My answer is, "As many as it can and no more."
Packets represent traffic and each is handled one at a time. From this perspective, my answer is, "One."
However, if a packet cannot be processed out of the critical paths in the chip and protocol stack fast enough to begin processing the next packet, packets can be dropped. Experience has shown these critical paths in iOS are dependent on the traffic's packet size and rate. Additionally, other devices in the area not connected to your BLE stack may be flooding the radio spectrum and causing packet collisions outside the stack. I have seen BLE traffic go to hell with an excess of 20 connections and as few as one. From this perspective my answer is, "It depends."

Where is the base address of a PCI device located?

I am trying to write to a board control register on a PMC A/D card attached to a PCI board with 4 DSPs on it. The A/D card sits on the PCI local bus and I know the values for its BARs, but I still cannot seem to write to the board control register from either the host PC or the DSPs.
So, my question is where exactly would the base address of the device be located? Is it in the RAM always, or is there not a specific location the PCI device is mapped to? I would like to initialize the board control register (which is supposed to be at 0x00 offset from its base) and be able to see that it is being set to the expected initialization value.
Base address for the board is assigned to the board by the operating system on start-up.
OS does a scanning of the PCI devices in the board and allots each device a non-conflicting address range.ie. OS writes the BAR during startup. BAR is a register (Read/Writable) which is implemented inside the PCI card. OS uses configuration cycles to write the to the BAR.

How does Linux kernel wifi driver determine when a connection is lost?

My understanding is that current WiFi driver uses rate control algorithm to choose a data rate within a small set of predetermined values to send packets over the WiFi medium. Different algorithms exist for this purpose. But how does this process work when WiFi driver decides that the connection is lost and shutdown the connection all together? Which part of the code should I read in open source WiFi driver such as MadWiFi and the likes?
The WiFi driver for your hardware which runs in Linux communicates with the WiFi chip which also runs a pretty complex firmware. The interface between the driver and the firmware is hardware specific. In some hardware the detection of connection loss events is done completely by the firmware and the driver only gets a "disconnected" event while in others the driver is also involved.
Regardless of who does what disconnection usually occurs due to either
Receiving a DEAUTH frame from the AP
Detecting too many missing beacons. Beacons are WiFi frames sent periodically by the AO (for most APs every ~100ms) . If you get too far from the AP or the AP was just powered off you stop seeing the beacons in the air and usually you'll signal disconnection or try to roam to a different AP.
Too many failures on Tx of packets (i.e. not receiving ACK frames for too much traffic)
This usually indicates that you've gone too far from the AP. It could be that you can "hear" the AP but it can't hear you already. In this case it also makes sense to signal a disconnection.
For example you can look in TI wifi driver in the Linux kernel drivers/net/wireless/ti/wlcore/events.c and the function wlcore_event_beacon_loss()
In Cfg80211 architecture, assume we are station mode.
driver call kernel API cfg80211_send_disassoc() if we received a deassoc/deauth frame.this function will notify corresponding application (ex wpa_supplicant) a disconnect event.
on another hand, when we decide to disconnect with AP, applicantion (ex wpa_supplicant) can call linux kernel API cfg80211_disconnected(), it will trigger corresponding driver ioctl function to finish disconnection task.

Resources