History

Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6

Pull crypto fixes from Herbert Xu: "This fixes regressions in the crypto ccp driver and the hwrng drivers for amd and geode" * 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6: hwrng: geode - Revert managed API changes hwrng: amd - Revert managed API changes crypto: ccp - Assign DMA commands to the channel's CCP

Linus Torvalds committed 9 years ago

Commit e8fe23f2 parents 213e4eb 8c757045 files · +75 −25Browse files

Unified · Split

5 files
  1. drivers/char/hw_random/amd-rng.c +34 −8
  2. drivers/char/hw_random/geode-rng.c +35 −15
  3. drivers/crypto/ccp/ccp-dev.c +4 −1
  4. drivers/crypto/ccp/ccp-dmaengine.c +1 −0
  5. include/linux/ccp.h +1 −1
drivers/char/hw_random/amd-rng.c+34−8
@@ -55,6 +55,7 @@ MODULE_DEVICE_TABLE(pci, pci_tbl); · 54 unmodified lines
5555 struct amd768_priv {
5656 void __iomem *iobase;
5757 struct pci_dev *pcidev;
58+ u32 pmbase;
5859 };
5960
6061 static int amd_rng_read(struct hwrng *rng, void *buf, size_t max, bool wait)
@@ -148,33 +149,58 @@ found: · 87 unmodified lines
148149 if (pmbase == 0)
149150 return -EIO;
150151
151− priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
152+ priv = kzalloc(sizeof(*priv), GFP_KERNEL);
152153 if (!priv)
153154 return -ENOMEM;
154155
155− if (!devm_request_region(&pdev->dev, pmbase + PMBASE_OFFSET,
156− PMBASE_SIZE, DRV_NAME)) {
156+ if (!request_region(pmbase + PMBASE_OFFSET, PMBASE_SIZE, DRV_NAME)) {
157157 dev_err(&pdev->dev, DRV_NAME " region 0x%x already in use!\n",
158158 pmbase + 0xF0);
159− return -EBUSY;
159+ err = -EBUSY;
160+ goto out;
160161 }
161162
162− priv->iobase = devm_ioport_map(&pdev->dev, pmbase + PMBASE_OFFSET,
163− PMBASE_SIZE);
163+ priv->iobase = ioport_map(pmbase + PMBASE_OFFSET, PMBASE_SIZE);
164164 if (!priv->iobase) {
165165 pr_err(DRV_NAME "Cannot map ioport\n");
166− return -ENOMEM;
166+ err = -EINVAL;
167+ goto err_iomap;
167168 }
168169
169170 amd_rng.priv = (unsigned long)priv;
171+ priv->pmbase = pmbase;
170172 priv->pcidev = pdev;
171173
172174 pr_info(DRV_NAME " detected\n");
173− return devm_hwrng_register(&pdev->dev, &amd_rng);
175+ err = hwrng_register(&amd_rng);
176+ if (err) {
177+ pr_err(DRV_NAME " registering failed (%d)\n", err);
178+ goto err_hwrng;
179+ }
180+ return 0;
181+
182+err_hwrng:
183+ ioport_unmap(priv->iobase);
184+err_iomap:
185+ release_region(pmbase + PMBASE_OFFSET, PMBASE_SIZE);
186+out:
187+ kfree(priv);
188+ return err;
174189 }
175190
176191 static void __exit mod_exit(void)
177192 {
193+ struct amd768_priv *priv;
194+
195+ priv = (struct amd768_priv *)amd_rng.priv;
196+
197+ hwrng_unregister(&amd_rng);
198+
199+ ioport_unmap(priv->iobase);
200+
201+ release_region(priv->pmbase + PMBASE_OFFSET, PMBASE_SIZE);
202+
203+ kfree(priv);
178204 }
179205
180206 module_init(mod_init);
drivers/char/hw_random/geode-rng.c+35−15
@@ -31,6 +31,9 @@ · 30 unmodified lines
3131 #include <linux/module.h>
3232 #include <linux/pci.h>
3333
34+
35+#define PFX KBUILD_MODNAME ": "
36+
3437 #define GEODE_RNG_DATA_REG 0x50
3538 #define GEODE_RNG_STATUS_REG 0x54
3639
@@ -82,6 +85,7 @@ static struct hwrng geode_rng = { · 45 unmodified lines
8285
8386 static int __init mod_init(void)
8487 {
88+ int err = -ENODEV;
8589 struct pci_dev *pdev = NULL;
8690 const struct pci_device_id *ent;
8791 void __iomem *mem;
@@ -89,27 +93,43 @@ static int __init mod_init(void) · 1 unmodified line
8993
9094 for_each_pci_dev(pdev) {
9195 ent = pci_match_id(pci_tbl, pdev);
92− if (ent) {
93− rng_base = pci_resource_start(pdev, 0);
94− if (rng_base == 0)
95− return -ENODEV;
96−
97− mem = devm_ioremap(&pdev->dev, rng_base, 0x58);
98− if (!mem)
99− return -ENOMEM;
100− geode_rng.priv = (unsigned long)mem;
101−
102− pr_info("AMD Geode RNG detected\n");
103− return devm_hwrng_register(&pdev->dev, &geode_rng);
104− }
96+ if (ent)
97+ goto found;
10598 }
106−
10799 /* Device not found. */
108− return -ENODEV;
100+ goto out;
101+
102+found:
103+ rng_base = pci_resource_start(pdev, 0);
104+ if (rng_base == 0)
105+ goto out;
106+ err = -ENOMEM;
107+ mem = ioremap(rng_base, 0x58);
108+ if (!mem)
109+ goto out;
110+ geode_rng.priv = (unsigned long)mem;
111+
112+ pr_info("AMD Geode RNG detected\n");
113+ err = hwrng_register(&geode_rng);
114+ if (err) {
115+ pr_err(PFX "RNG registering failed (%d)\n",
116+ err);
117+ goto err_unmap;
118+ }
119+out:
120+ return err;
121+
122+err_unmap:
123+ iounmap(mem);
124+ goto out;
109125 }
110126
111127 static void __exit mod_exit(void)
112128 {
129+ void __iomem *mem = (void __iomem *)geode_rng.priv;
130+
131+ hwrng_unregister(&geode_rng);
132+ iounmap(mem);
113133 }
114134
115135 module_init(mod_init);
drivers/crypto/ccp/ccp-dev.c+4−1
@@ -283,11 +283,14 @@ EXPORT_SYMBOL_GPL(ccp_version); · 282 unmodified lines
283283 */
284284 int ccp_enqueue_cmd(struct ccp_cmd *cmd)
285285 {
286− struct ccp_device *ccp = ccp_get_device();
286+ struct ccp_device *ccp;
287287 unsigned long flags;
288288 unsigned int i;
289289 int ret;
290290
291+ /* Some commands might need to be sent to a specific device */
292+ ccp = cmd->ccp ? cmd->ccp : ccp_get_device();
293+
291294 if (!ccp)
292295 return -ENODEV;
293296
drivers/crypto/ccp/ccp-dmaengine.c+1−0
@@ -390,6 +390,7 @@ static struct ccp_dma_desc *ccp_create_desc(struct dma_chan *dma_chan, · 389 unmodified lines
390390 goto err;
391391
392392 ccp_cmd = &cmd->ccp_cmd;
393+ ccp_cmd->ccp = chan->ccp;
393394 ccp_pt = &ccp_cmd->u.passthru_nomap;
394395 ccp_cmd->flags = CCP_CMD_MAY_BACKLOG;
395396 ccp_cmd->flags |= CCP_CMD_PASSTHRU_NO_DMA_MAP;
include/linux/ccp.h+1−1
@@ -556,7 +556,7 @@ enum ccp_engine { · 555 unmodified lines
556556 * struct ccp_cmd - CCP operation request
557557 * @entry: list element (ccp driver use only)
558558 * @work: work element used for callbacks (ccp driver use only)
559− * @ccp: CCP device to be run on (ccp driver use only)
559+ * @ccp: CCP device to be run on
560560 * @ret: operation return code (ccp driver use only)
561561 * @flags: cmd processing flags
562562 * @engine: CCP operation to perform