On Mon, 16 Dec 2019 17:06:14 +0100,
Patrick May wrote:
> Hello,
> I have a C-Media CMI8738 soundcard. I'm using it because it has a
> special feature that I want: the OPL3 synth.
> It creates two ALSA MIDI ports. In my case, these are '20:0, C-Media
> CMI8738, C-Media CMI8738 MIDI' and '21:0, OPL3 FM synth, OPL3 FM
> Port'.
> The first one is completely useless - this soundcard actually has no
> game/midi port connector on it. The second one is what I really want.
> The problem I have is that the first port has a weird problem in that
> if you access it in some way (eg. play a midi file through it with
> aplaymidi) it has a very high chance of making the computer reboot
> suddenly and without warning. This seems to be different from a kernel
> panic because my system is configured not to automatically reboot on
> panic, and I don't get the capslock/scroll lock lights flashing - the
> system just reboots suddenly and without warning.
> I can't simply avoid using that MIDI port - music software I use, such
> as Rosegarden, seems to automatically connect to all MIDI ports as
> part of its initialisation routine. I discovered the problem because
> it was happening (my system was unexpectedly rebooting) every few
> times I opened a project file in Rosegarden.
> So I'm looking for a workaround that will remove/destroy/eliminate
> this unwanted and unused MIDI port so that nothing can make my system
> reboot by accident. So far I have tried this:
> * load snd_cmipci with parameter 'mpu_port=0'. This didn't work, the
> unwanted port was still created and still caused the reboot when I
> tested it.
> * prevent snd_mpu401_uart from loading. This didn't work - snd_cmipci
> refused to load without it.
> Does anyone have any ideas or suggestions?
> Maybe this is something that the ALSA driver developers should be made
> aware of, but I thought I should ask about it here first.

A patch like below should make mpu_port=0 option working to disable
for the MIDI port.  Give it a try.


diff --git a/sound/pci/cmipci.c b/sound/pci/cmipci.c
index 4bfab21c53f4..92610ab3290d 100644
--- a/sound/pci/cmipci.c
+++ b/sound/pci/cmipci.c
@@ -42,7 +42,7 @@ MODULE_SUPPORTED_DEVICE("{{C-Media,CMI8738},"
 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;     /* Index 0-MAX */
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;      /* ID for this card */
 static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;    /* Enable 
switches */
-static long mpu_port[SNDRV_CARDS];
+static long mpu_port[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)]=1};
 static long fm_port[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)]=1};
 static bool soft_ac3[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)]=1};
@@ -3132,7 +3132,8 @@ static int snd_cmipci_create(struct snd_card *card, 
struct pci_dev *pci,
        if (cm->chip_version >= 39) {
                val = snd_cmipci_read_b(cm, CM_REG_MPU_PCI + 1);
                if (val != 0x00 && val != 0xff) {
-                       iomidi = cm->iobase + CM_REG_MPU_PCI;
+                       if (mpu_port[dev])
+                               iomidi = cm->iobase + CM_REG_MPU_PCI;
                        integrated_midi = 1;

Alsa-user mailing list

Reply via email to