Linux driver for PCI device not hot plugging - hardware

I am writing a Linux PCI driver for a PCIe device that must be hot pluggable.
The device attaches via cable to a PCIe redriver card that fits into a PCIe slot.
When the device is plugged in at boot time, I can find it with lspci, and the driver probes successfully. However, if the cable is unplugged during run time, lspci still shows the device as present, and the driver's PCI remove method is not called, even after echoing '1' to /sys/bus/pci/rescan.
This problem reverses itself if the device is not plugged in at boot time: it will not be showed with lspci, even after the cable is connected, and the probe method won't get called.
My module uses the pci_register_driver() and pci_unregister_driver() library; the driver uses only the probe and remove methods (no suspend or resume), and id_table initializes the vendor id and device id.
Are there functions in the Linux Kernel that need to be called to register a PCI device for hot plugging?

Related

List UART -> COM converter in Windows Device Portal

I have Raspberry Pi 3 plate with connected USB to UART (COM) converter.
The power led on the USB stick is ON.
I can not find the converter in Windows Device Portal.
In both: connected and disconnected states I see just two UART related records in Device Manager:
(ID:ACPI\BCM2835\0, Class:System, Manufacturer:Microsoft, StatusCode:25165834)
>BCM283x Mini UART Serial Device
(ID:ACPI\BCM2836\0, Class:Ports, Manufacturer:Microsoft, StatusCode:25182218)
>ARM PL011 UART Device Driver
(ID:ACPI\BCM2837\4, Class:System, Manufacturer:Microsoft, StatusCode:25165834)
Also I use git diff between saved device lists and there is no difference between the case I connect USB stick and disconnect it.
Where can I see the device in the list?
UPDATE
Here I print all found devices:
First you need make sure your USB to UART (COM) converter is supported on Windows IoT Core. Please check the hardware compatibility list. The CP2102 USB 2.0 to TTL Module Serial Converter is supported.
I use CP2102 USB to UART Bridge Converter and it also works. Use the SerialUART sample can list two device: one is on-board PL011 UART Device and the other is mine.
From device portal:

Resetting USB Driver

I have a SOM module working on AM3352 TI processor. It has 2 USB ports. One of the port is connected to a USB hub on-to which a USB camera is connected.
AM3352 USB <---------- USB HUB <----------- USB Camera
On the system I also have another module which runs on 6.3 V. Since my input is only 5V, I am using a DC-DC converter to boost the voltage to 6.3.
What I observe is that, when I turn on the 6.3V module, there is dip in my input voltage for a short duration. The VBUS goes below 4.4V for this time period and I get a VBUS error. The voltage goes back to the previous state after this time but my device gets dropped. I wont be able to use the camera after this
Is there a way to restart the full usb driver so that the camera will get detected and I can use it for the intended purpose?

STM32F04 in DFU mode recognized only when powered from battery (Win10)

I made a STM32F042k6, battery powered device, that I would to flash vi DFU protocol.
In order to do so I disconnect the battery, I pull BOOT0 to VCC, and then plug the device in USB3 port of PC (no USB2 available). The device is not recognized and showed
VID:0000 PID:0002 (case I)
However, when I first connect battery, and then connect the device to PC it is recognized without a fuss (case II).
The problem I face is that I would like to initiate jump to bootloader program by command in software - but then I reach exactly the same condition as in case I.
Could you help me to identify what conditions for proper boot I am violating?
EDIT:
The way I have discovered the problem was when I implemented software jump to bootloader. It seemed not to work at all (VCP device dissapeared, and erroreous <> device appeard in system PID:0002 VID:0000).
I wanted to enter bootloader by pulling up BOOT0 pin, but I could see that I sucseed only when battery-power cycled. USB power cyccle resulted in the same "failed descriptor" device.
I suspect that when powered on via USB, the booloader has som ecommunication problems and cannot establish proper PID and VID. When powered via battery - this problem is not existing.
Do you have a discovery board?
I read in the STM32F042x4/x6 Reference Manual (DocID025832 Rev 5):
The STM32F042x4/x6 embeds a full-speed USB device peripheral compliant
with the USB specification version 2.0.
(part 3.19, p.27).
In the AN2606 (Rev 33), a table shows the USB configuration which is used by the DFU Bottolader in USB FS (Full-speed):
I assume that the USB in the bootloader is the 2.0, but USB 3.0 must be USB 2.0 compliant. So it is possible to use an USB 3.0 port.
I suggest you use the DfUSe Demo from ST. Its interface consists of a tab where the DFU devices available are displayed when detected. I try it on another STM32x by following these steps:
Open DfuSe Demo software.
Plug BOOT0 to Vdd to put the micro on DFU mode.
Plug the USER USB to your computer port.
The name of your device should appear in “Available DFU Devices” field.
You could try to use directly PA11 and PA12 as well (according to Table 12) instead of the USB port of your board.
EDIT:
Another solution to upgrade your firmware without driving boot0 is to jump directly into the DFU bootloader of ST inside your firmware. Else you could design your own IAP bootloader (In-Application Programming).
I hope that helps.
I faced this same issue with the STM32 Mini F401 and dug into it for several days. Unlike the OP I was unable to find any electrical conditions which reliably got the bootloader to do the right thing. I was able to program my board maybe once every 20 tries, which was really slowing down my process.
In the end I discovered that I can go to the Windows device manager, show hidden devices, and there will be an entry in Universal Serial Bus Devices called STM32 BOOTLOADER. When the issue is happening the board is connected in dfu mode but that device is not marked active in the device manager.
To resolve the issue consistently, you can manually delete the hidden STM32 BOOTLOADER entry, uninstalling the device (no need to delete the driver, just uninstall the device). Then reboot your board in DFU mode and it should connect as expected every time. Unfortunately I need to do this process every time I want to program, but that's far better than the inconsistent/intermittent failures before.

How to passthrough an usb hub to a vm (based on kvm)?

linux kernel 4.9.7
libvirt 2.4.0
qemu 2.7.0
HOST:
i7 6700
ASUS B250M-PLUS
2xGTX1060 3GB
500Wpower
1x PCIEtoUSB3.0 card (Reneses chip)
I have two VMs using different GPU
I'm using usb controller passthrough now
VM1 has motherboard controller
VM2 has the PCIE CARD
BUT!!!!!!it is instability!!!!!
mouse and keyboard will be no use sometimes
so i am thinking about passthrough usb hub to be stable
is there any way to do it
this question is interesting. But you should provide more infos about the problem, how you started the machine, what precisel is working and what not.
Btw, use some more time to format your question...
Maybe you background is, that it is dificult and mayby impossible to passthrough an hub to a vom using the normal QEMU VID/PID combination. You can probably show the VM the hub, but all devcices connected to it are still owned by the host.^^
The only way I see is to pass through your nice PCIe USB3.0 controller to your desired VM. You need to enable the IOMMU feature in Grub for KVM to do so. But then it will work.

Getting Hotplug react when plugging 3G netstick (with mdev)

I'm trying to get a device running embedded linux V-2.6.31 to automatically recognize when a Huawei 3G usb stick is plugged to it, run usb_modeswitch, and communicate with the module.
it seems that usb_modeswitch doesn't work well in a system that has mdev, since the path /dev/bus/usb is only being created with udev.
I found a script that create this path and enable usb_modeswitch to work properly.
now, all i need is automation of this process, e.g., when plugging the 3G module, hotplug will first call my script, and then usb_modeswitch.
the problem is that when plugging the 3G module nothing happens when the enumeration is done (the hotplug wont run), see trace:
[83175.520000] usb 2-1: new full speed USB device using bcm5892-ohci:PORT-2 and address 3
[83175.730000] usb 2-1: not running at top speed; connect to a high speed hub
[83175.750000] usb 2-1: New USB device found, idVendor=12d1, idProduct=1f1c
[83175.760000] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[83175.770000] usb 2-1: Product: HUAWEI Mobile
[83175.770000] usb 2-1: Manufacturer: Vodafone(Huawei)
[83175.780000] usb 2-1: SerialNumber: FFFFFFFFFFFFFFFF
[83175.800000] usb 2-1: configuration #1 chosen from 2 choices
[83175.870000] scsi1 : SCSI emulation for USB Mass Storage devices
[83180.910000] scsi 1:0:0:0: CD-ROM HUAWEI Mass Storage 2.31 PQ: 0 ANSI: 2
I'm not sure what is wrong, is there something i didn't enable? is there a KO that i need to load in order for it to work?
Thank you in advance!