diff --git a/lib/manager/cargo/__snapshots__/artifacts.spec.ts.snap b/lib/manager/cargo/__snapshots__/artifacts.spec.ts.snap
index babdcd777c79ce1615331fb8732cf6f40e97bca2..c063131c289d64a252a23e362fc76c9c411e9f5e 100644
--- a/lib/manager/cargo/__snapshots__/artifacts.spec.ts.snap
+++ b/lib/manager/cargo/__snapshots__/artifacts.spec.ts.snap
@@ -3,7 +3,7 @@
 exports[`manager/cargo/artifacts returns null if unchanged 1`] = `
 Array [
   Object {
-    "cmd": "cargo update --manifest-path Cargo.toml --package dep1",
+    "cmd": "cargo update --manifest-path Cargo.toml --workspace",
     "options": Object {
       "cwd": "/tmp/github/some/repo",
       "encoding": "utf-8",
@@ -26,7 +26,7 @@ Array [
 exports[`manager/cargo/artifacts returns updated Cargo.lock 1`] = `
 Array [
   Object {
-    "cmd": "cargo update --manifest-path Cargo.toml --package dep1",
+    "cmd": "cargo update --manifest-path Cargo.toml --workspace",
     "options": Object {
       "cwd": "/tmp/github/some/repo",
       "encoding": "utf-8",
@@ -84,7 +84,7 @@ Array [
     },
   },
   Object {
-    "cmd": "docker run --rm --name=renovate_rust --label=renovate_child -v \\"/tmp/github/some/repo\\":\\"/tmp/github/some/repo\\" -w \\"/tmp/github/some/repo\\" renovate/rust bash -l -c \\"cargo update --manifest-path Cargo.toml --package dep1\\"",
+    "cmd": "docker run --rm --name=renovate_rust --label=renovate_child -v \\"/tmp/github/some/repo\\":\\"/tmp/github/some/repo\\" -w \\"/tmp/github/some/repo\\" renovate/rust bash -l -c \\"cargo update --manifest-path Cargo.toml --workspace\\"",
     "options": Object {
       "cwd": "/tmp/github/some/repo",
       "encoding": "utf-8",
@@ -107,7 +107,7 @@ Array [
 exports[`manager/cargo/artifacts returns updated workspace Cargo.lock 1`] = `
 Array [
   Object {
-    "cmd": "cargo update --manifest-path crates/one/Cargo.toml --package dep1",
+    "cmd": "cargo update --manifest-path crates/one/Cargo.toml --workspace",
     "options": Object {
       "cwd": "/tmp/github/some/repo",
       "encoding": "utf-8",
@@ -130,7 +130,7 @@ Array [
 exports[`manager/cargo/artifacts updates Cargo.lock based on the lookupName, when given 1`] = `
 Array [
   Object {
-    "cmd": "cargo update --manifest-path Cargo.toml --package dep1",
+    "cmd": "cargo update --manifest-path Cargo.toml --workspace",
     "options": Object {
       "cwd": "/tmp/github/some/repo",
       "encoding": "utf-8",
diff --git a/lib/manager/cargo/artifacts.ts b/lib/manager/cargo/artifacts.ts
index 6898b9d4b9354d610cec37b9643fb3c3cde0263a..1788c8d18c4e170a66a9a809a919b9a188f17085 100644
--- a/lib/manager/cargo/artifacts.ts
+++ b/lib/manager/cargo/artifacts.ts
@@ -7,16 +7,17 @@ import {
   readLocalFile,
   writeLocalFile,
 } from '../../util/fs';
-import { regEx } from '../../util/regex';
 import type { UpdateArtifact, UpdateArtifactsResult } from '../types';
 
 async function cargoUpdate(
   manifestPath: string,
-  packageName?: string
+  isLockFileMaintenance: boolean
 ): Promise<void> {
   let cmd = `cargo update --manifest-path ${quote(manifestPath)}`;
-  if (packageName) {
-    cmd += ` --package ${quote(packageName)}`;
+  // If we're updating a specific crate, `cargo-update` requires `--workspace`
+  // for more information, see: https://github.com/renovatebot/renovate/issues/12332
+  if (!isLockFileMaintenance) {
+    cmd += ` --workspace`;
   }
 
   const execOptions: ExecOptions = {
@@ -24,28 +25,7 @@ async function cargoUpdate(
       image: 'rust',
     },
   };
-  try {
-    await exec(cmd, execOptions);
-  } catch (err) /* istanbul ignore next */ {
-    // Two different versions of one dependency can be present in the same
-    // crate, and when that happens an attempt to update it with --package ${dep}
-    // key results in cargo exiting with error code `101` and an error message:
-    // "error: There are multiple `${dep}` packages in your project".
-    //
-    // If exception `err` was caused by this, we execute `updateAll` function
-    // instead of returning an error. `updateAll` function just executes
-    // "cargo update --manifest-path ${localPackageFileName}" without the `--package` key.
-    //
-    // If exception `err` was not caused by this, we just rethrow it. It will be caught
-    // by the outer try { } catch {} and processed normally.
-    const msgStart = 'error: There are multiple';
-    if (err.code === 101 && err.stderr.startsWith(msgStart)) {
-      cmd = cmd.replace(regEx(/ --package.*/), '');
-      await exec(cmd, execOptions);
-    } else {
-      throw err; // this is caught below
-    }
-  }
+  await exec(cmd, execOptions);
 }
 
 export async function updateArtifacts({
@@ -83,15 +63,7 @@ export async function updateArtifacts({
   try {
     await writeLocalFile(packageFileName, newPackageFileContent);
     logger.debug('Updating ' + lockFileName);
-    for (let i = 0; i < updatedDeps.length; i += 1) {
-      const dep = updatedDeps[i];
-      // Update dependency `${dep}` in Cargo.lock file corresponding to Cargo.toml file located
-      // at ${localPackageFileName} path
-      await cargoUpdate(packageFileName, dep.lookupName ?? dep.depName);
-    }
-    if (isLockFileMaintenance) {
-      await cargoUpdate(packageFileName);
-    }
+    await cargoUpdate(packageFileName, isLockFileMaintenance);
     logger.debug('Returning updated Cargo.lock');
     const newCargoLockContent = await readLocalFile(lockFileName);
     if (existingLockFileContent === newCargoLockContent) {